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

题目

表: Queue

SQL-每日一题【1204. 最后一个能进入巴士的人】_第1张图片

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

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

查询结果格式如下所示。

示例:

SQL-每日一题【1204. 最后一个能进入巴士的人】_第2张图片

SQL-每日一题【1204. 最后一个能进入巴士的人】_第3张图片

解题思路

前置知识

sum() over() 函数

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

数据源:

SQL-每日一题【1204. 最后一个能进入巴士的人】_第4张图片 
1、按照日期对应的V1(数字)进行升序(desc降序),然后进行累加

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

SQL-每日一题【1204. 最后一个能进入巴士的人】_第5张图片

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

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

测试结果

SQL-每日一题【1204. 最后一个能进入巴士的人】_第6张图片

你可能感兴趣的:(sql,算法,数据库)