SQL-每日一题【1204. 最后一个能进入巴士的人】

题目

表: Queue

有一队乘客在等着上巴士。然而,巴士有1000  千克 的重量限制,所以其中一部分乘客可能无法上巴士。

写一条 SQL 查询语句找出 最后一个 上巴士且不超过重量限制的乘客,并报告 person_name 。题目测试用例确保顺位第一的人可以上巴士且不会超重。

查询结果格式如下所示。

示例:

解题思路

前置知识

sum() over() 函数

需要按天累加,也就是累计指标计算,可以使用到该函数
1.可以按天进行累加
2.如果有相同的日期,可以先按天分组,然后进行累加,筛选项也是一样

数据源:

 
1、按照日期对应的V1(数字)进行升序(desc降序),然后进行累加

select 
    V0, V1, sum(V1) over(order by V1 )
from table

了解了上述窗口函数后,我们一起来看一下这道题

1.题目要求我们找出最后一个 上巴士且不超过重量限制的乘客,题目中的例子有点问题,查询出的应该是 John Cena,大概意思就是,将要查询的表中已经给出了上车顺序,我们只需要找出最后一个上车且不会超重的乘客。

2.我们可以使用子查询来求解这道题,首先我们用子查询在每一条记录上计算出按turn的大小排序后从第一行到当前行的weight字段的累计总和,并将结果命名为total。

3.然后找出 所有 total <= 1000 的记录,进行倒序排序,找出第一条记录就为最后一个 上巴士且不超过重量限制的乘客。

代码实现

select person_name
from(
    select person_name,
    sum(weight) over (order by turn) total
    from Queue
) a
where total <= 1000
order by total desc
limit 1

测试结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值