You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑说明:

  1. 子查询(SELECT MAX(id) FROM tbl)会先返回表中最大的id(这里是2);
  2. WHERE id = ...过滤出所有id等于这个最大值的行;
  3. 最后通过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;

逻辑说明:

  1. 先用CTE(公共表表达式)给每行数据按id降序排名,最大的id对应的行排名为1;
  2. 过滤出排名为1的行,再进行聚合计算,得到你需要的结果。

两种方法最终都会输出你期望的结果:

idnamesum_of_subtasksum_of_maintaskdiff
2t144036

内容的提问来源于stack exchange,提问作者TheDataGuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:47:54