一、完整建表 SQLMySQL 语法CREATE TABLE Queue( person_id INT, person_name VARCHAR(20), weight INT, turn INT, PRIMARY KEY(person_id) );INSERT INTO Queue(person_id,person_name,weight,turn) VALUES (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);二、需求有一队乘客在等着上巴士。然而巴士有1000千克的重量限制所以其中一部分乘客可能无法上巴士。编写解决方案找出最后一个上巴士且不超过重量限制的乘客并报告person_name。题目测试用例确保顺位第一的人可以上巴士且不会超重。返回结果格式如下所示。三、 思路与解题这道题如果没有窗口函数基础的话连第一步都写不去更别说后面还有 取 total_weight 1000 的最后那条数据 的逻辑了建议先学一遍文章 窗口函数其实这道题还很仁慈那个简化的表就是暗示我们要使用窗口函数# Write your MySQL query statement below select person_name from ( select person_name,sum(weight) over(order by turn) total_weight from Queue ) t where total_weight1000 ORDER BY total_weight DESC LIMIT 1;本题核心考点是窗口函数实现累计求和。利用 SUM(weight) OVER(ORDER BY turn) 按照上车顺序turn依次累加体重。这里OVER 内部书写 ORDER BY默认窗口范围为 UNBOUNDED PRECEDING AND CURRENT ROW 实现逐行累计将窗口函数的计算结果放到子查询里面窗口函数别名不能直接用于WHERE条件筛选出总重量 total_weight 1000 的记录将符合条件的数据按照累计重量降序排序LIMIT 1取出最后一个成功上车的乘客五、总结刚开始学习窗口函数时大部分人只会记住OVER搭配函数的语法做题时完全不知道怎么结合业务场景。通过这道题明白了窗口函数第一步只负责计算生成新列第二步外层再做筛选做题分两步走就不会混乱。以后遇到顺序累加问题直接套用SUM() OVER(ORDER BY xxx)模板即可