SQL问题:取最大ID对应数据的subtask与maintask总和及差值
解决SQL筛选最大id并聚合求和的问题
嗨,我来帮你搞定这个SQL问题~你原来的查询之所以会计算所有数据的总和,是因为group by name把所有name相同的行(不管id大小)都归到了一组,再加上max(id)只是取了组里最大的id,但聚合的还是整个组的所有数据,这就不符合你只针对最大id数据求和的需求啦。
这里给你两种简单有效的解法:
方法一:子查询先获取最大id再过滤
这种方法最直接,先通过子查询拿到表中最大的id值,再过滤出对应的数据进行聚合计算:
SELECT id, name, SUM(subtask) AS sum_of_subtask, SUM(maintask) AS sum_of_maintask, SUM(maintask) - SUM(subtask) AS diff FROM tbl WHERE id = (SELECT MAX(id) FROM tbl) GROUP BY id, name;
逻辑说明:
- 子查询
(SELECT MAX(id) FROM tbl)会先返回表中最大的id(这里是2); WHERE id = ...过滤出所有id等于这个最大值的行;- 最后通过
GROUP BY id, name对筛选后的行进行聚合,计算两个字段的求和,以及sum(maintask) - sum(subtask)得到差值(对应你期望的36)。
方法二:用窗口函数标记最大id的行
如果你的SQL支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server等),也可以用这种方式:
WITH ranked_data AS ( SELECT *, RANK() OVER (ORDER BY id DESC) AS rnk FROM tbl ) SELECT id, name, SUM(subtask) AS sum_of_subtask, SUM(maintask) AS sum_of_maintask, SUM(maintask) - SUM(subtask) AS diff FROM ranked_data WHERE rnk = 1 GROUP BY id, name;
逻辑说明:
- 先用CTE(公共表表达式)给每行数据按id降序排名,最大的id对应的行排名为1;
- 过滤出排名为1的行,再进行聚合计算,得到你需要的结果。
两种方法最终都会输出你期望的结果:
| id | name | sum_of_subtask | sum_of_maintask | diff |
|---|---|---|---|---|
| 2 | t1 | 4 | 40 | 36 |
内容的提问来源于stack exchange,提问作者TheDataGuy
相关产品推荐
相关产品推荐

