如何编写SQL查询获取累计重量超过1000时对应人员的姓名
问题分析
你需要实现的是按turn字段的排队顺序累加重量,找到累计值首次超过1000对应的人员姓名。原有SQL的问题有两点:
- 自连接条件错误,
t2.id = t1.id只会关联到当前行自身,SUM统计的永远是单条记录的重量,没法实现累计求和效果 - 筛选逻辑只取了累计小于1000的行,无法直接拿到超出阈值的第一条记录
方案1:窗口函数实现(推荐,兼容MySQL 8.0+/PostgreSQL/SQL Server等所有主流新版数据库)
用SUM()开窗按turn排序做累计求和,再筛选第一个累计值超过1000的记录即可:
SELECT name FROM ( SELECT name, SUM(weight) OVER (ORDER BY turn ASC) AS cumulative_weight FROM line ) t WHERE cumulative_weight > 1000 ORDER BY cumulative_weight ASC LIMIT 1;
方案2:自连接实现(兼容不支持窗口函数的老版本数据库)
基于你原有写法调整连接逻辑和筛选规则即可:
SELECT t1.name FROM line t1 JOIN line t2 ON t2.turn <= t1.turn GROUP BY t1.id, t1.name, t1.turn, t1.weight HAVING SUM(t2.weight) > 1000 ORDER BY t1.turn ASC LIMIT 1;
逻辑说明:关联所有turn小于等于当前行的记录,分组后统计每组的累计重量,筛选出累计超过1000的记录后按turn排序取第一条,就是首次超出阈值的人员。
内容的提问来源于stack exchange,提问作者appl3m4n
相关产品推荐
相关产品推荐

