题目
表: 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