SQL-leetcode—1204. 最后一个能进入巴士的人

1204. 最后一个能进入巴士的人

表: Queue

±------------±--------+
| Column Name | Type |
±------------±--------+
| person_id | int |
| person_name | varchar |
| weight | int |
| turn | int |
±------------±--------+
person_id 是这个表具有唯一值的列。
该表展示了所有候车乘客的信息。
表中 person_id 和 turn 列将包含从 1 到 n 的所有数字,其中 n 是表中的行数。
turn 决定了候车乘客上巴士的顺序,其中 turn=1 表示第一个上巴士,turn=n 表示最后一个上巴士。
weight 表示候车乘客的体重,以千克为单位。

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

编写解决方案找出 最后一个 上巴士且不超过重量限制的乘客,并报告 person_name 。题目测试用例确保顺位第一的人可以上巴士且不会超重。

返回结果格式如下所示。

示例 1:

输入:
Queue 表
±----------±------------±-------±-----+
| person_id | person_name | weight | turn |
±----------±------------±-------±-----+
| 5 | Alice | 250 | 1 |
| 4 | Bob | 175 | 5 |
| 3 | Alex | 350 | 2 |
| 6 | John Cena | 400 | 3 |
| 1 | Winston | 500 | 6 |
| 2 | Marie | 200 | 4 |
±----------±------------±-------±-----+
输出:
±------------+
| person_name |
±------------+
| John Cena |
±------------+
解释:
为了简化,Queue 表按 turn 列由小到大排序。
±-----±—±----------±-------±-------------+
| Turn | ID | Name | Weight | Total Weight |
±-----±—±----------±-------±-------------+
| 1 | 5 | Alice | 250 | 250 |
| 2 | 3 | Alex | 350 | 600 |
| 3 | 6 | John Cena | 400 | 1000 | (最后一个上巴士)
| 4 | 2 | Marie | 200 | 1200 | (无法上巴士)
| 5 | 4 | Bob | 175 | ___ |
| 6 | 1 | Winston | 500 | ___ |
±-----±—±----------±-------±-------------+

题解

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

  • 最后一个上巴士且不超过重量限制的乘客
    根据输入输出可以看到,实际上就是一个累计的过程,累计到当前行,刚好在大巴的承重范围内即可。 – sum over ?

  • turn 决定了候车乘客上巴士的顺序,其中 turn=1 表示第一个上巴士,turn=n 表示最后一个上巴士。
    turn 标识登车顺序,所以要加上排序 – order by

应该怎么解呢?

方法一 SUM() over + limit

首先把累计值算出来形成宽表,然后过滤出最后一个人即可。

with tmp as (
    select 
        *
        ,sum(weight) over(order by turn) as total_wei
    from Queue
)
select
    person_name
from tmp where total_wei<=1000 order by turn desc limit 1

方法二 自连接实现累计

先来个图,再来分析sql逻辑
在这里插入图片描述
首先把A表自连接,起名为A和B,连接以后的效果是笛卡尔
再加一把条件,A >=B 就有了右侧的数据结果
根据A分组求和B,即可获取累计值

SELECT a.person_name
FROM Queue a, Queue b
WHERE a.turn >= b.turn
GROUP BY a.person_id HAVING SUM(b.weight) <= 1000
ORDER BY a.turn DESC
LIMIT 1

先这样把

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掉进悬崖的狼

请博主喝杯奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值