You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
两张表自连接的条件是 a.turn >= b.turn,这样就可以保证 b 表的 turn 是小于等于 a 表的 turn
使用 group by 分组后,b 表的所有字段是聚合的
我们使用 sum 函数,对 b.weight 字段进行求和,就可以得到每行的值
SELECTa.person_nameFROM
Queue a, Queue b
WHEREa.turn>=b.turnGROUP BYa.person_name, a.turnHAVINGSUM( b.weight ) <=1000ORDER BYa.turnDESCLIMIT1;
方法二
使用窗口函数,可以进行累加
在 sum() 函数后面加上 over 就可以按行累加了
使用 with 子查询,将查出来的数据放在临时表中 tmp 中
对临时表进行查询筛选出当前重量小于 1000 的数据
WITH tmp AS (
SELECT person_name, sum( weight ) over ( ORDER BY turn ) AS weight_sum FROM Queue
)
SELECT person_name FROM tmp WHERE weight_sum <=1000ORDER BY weight_sum DESCLIMIT1;
方法三
使用子查询和变量的形式,累加行
( SELECT @pre := 0 ) tmp 初始化变量
@pre := @pre + weight AS sum_weight 累加变量
使用 from 子查询,对临时表进行查询,筛选出当前重量小于 1000 的数据
SELECTtmp.person_nameFROM (
SELECT
person_name, @pre := @pre + weight AS sum_weight
FROM Queue, ( SELECT @pre :=0 ) tmp ORDER BY turn
) tmp
WHEREtmp.sum_weight<=1000ORDER BYtmp.sum_weightDESCLIMIT1
The text was updated successfully, but these errors were encountered:
题目
题目链接:最后一个能进入巴士的人
有一队乘客在等着上巴士。然而,巴士有 1000 千克 的重量限制,所以其中一部分乘客可能无法上巴士。
编写解决方案找出 最后一个 上巴士且不超过重量限制的乘客,并报告 person_name 。题目测试用例确保顺位第一的人可以上巴士且不会超重。
返回结果格式如下所示。
解析
本题考察了一个知识点:如何按行累加
在
mysql
实现这种功能,有三种方式:a
表分组,聚合b
表使用窗口函数和变量的形式都涉及到子查询:
with
子查询:类似与公共表表达式from
子查询:类似与临时表方法一
使用自连接,连接条件是
a.turn >= b.turn
,然后按照a.person_id
和a.turn
分组为什么是按照
a
表去分组?因为按照
a
表分组,聚合的是b
表两张表自连接的条件是
a.turn >= b.turn
,这样就可以保证b
表的turn
是小于等于a
表的turn
使用
group by
分组后,b
表的所有字段是聚合的我们使用
sum
函数,对b.weight
字段进行求和,就可以得到每行的值方法二
使用窗口函数,可以进行累加
sum()
函数后面加上over
就可以按行累加了with
子查询,将查出来的数据放在临时表中tmp
中1000
的数据方法三
使用子查询和变量的形式,累加行
( SELECT @pre := 0 ) tmp
初始化变量@pre := @pre + weight AS sum_weight
累加变量from
子查询,对临时表进行查询,筛选出当前重量小于1000
的数据The text was updated successfully, but these errors were encountered: