【MySQL】根据某一字段累加计算出每一行数据形成新字段(累积求和)

力扣题

1、题目地址

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

2、模拟表

表:Queue

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

3、要求

  • 有一队乘客在等着上巴士。然而,巴士有1000 千克 的重量限制,所以其中一部分乘客可能无法上巴士。
  • 编写解决方案找出 最后一个 上巴士且不超过重量限制的乘客,并报告 person_name 。
  • 题目测试用例确保顺位第一的人可以上巴士且不会超重。

4、示例

输入:

Queue 表:

person_idperson_nameweightturn
5Alice2501
4Bob1755
3Alex3502
6John Cena4003
1Winston5006
2Marie2004

输出:

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    | ___          |
+------+----+-----------+--------+--------------+

5、代码编写

思路

SELECT a.turn, a.person_name, a.weight, SUM(b.weight) AS weightSum
FROM Queue a, Queue b
WHERE a.turn >= b.turn
GROUP BY a.turn
ORDER BY a.turn
| turn | person_name | weight | weightSum |
| ---- | ----------- | ------ | --------- |
| 1    | Alice       | 250    | 250       |
| 2    | Alex        | 350    | 600       |
| 3    | John Cena   | 400    | 1000      |
| 4    | Marie       | 200    | 1200      |
| 5    | Bob         | 175    | 1375      |
| 6    | Winston     | 500    | 1875      |

取体重累积小于或等于 1000 的数据

SELECT a.turn, a.person_name, a.weight, SUM(b.weight) AS weightSum
FROM Queue a, Queue b
WHERE a.turn >= b.turn
GROUP BY a.turn
HAVING weightSum <= 1000
ORDER BY a.turn
| turn | person_name | weight | weightSum |
| ---- | ----------- | ------ | --------- |
| 1    | Alice       | 250    | 250       |
| 2    | Alex        | 350    | 600       |
| 3    | John Cena   | 400    | 1000      |

之后排序改成倒序,取第一行数据即可

最终写法

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

参考

MySQL 累积求和

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值