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

如何编写SQL查询获取分组内前序行累计金额(不含当前行)

编写SQL查询获取分组内前序行金额总和的最优方式

需求说明

需要实现SQL查询,达成以下目标:

获取当前行数据,同时计算出分组内当前行之前所有行的金额总和

假设存在一张表,包含Id、Group、Amount三个字段,预期查询结果如下:

IdGroupAmountPreviousAmount*
112NULL
2122
3124
422NULL

尝试的问题

我原本写了如下查询:

SELECT
    *,
    SUM(Amount) OVER (PARTITION BY Group ORDER BY ID RANGE UNBOUNDED PRECEDING) as Prev
FROM Table

但这个查询会把当前行的金额也包含在总和里,不符合需求。

最优解法

以下两种方式都是高效且表达清晰的方案:

方式一:明确指定窗口范围

通过ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING,精确限定窗口为分组内从第一行到当前行的前一行:

SELECT
    Id,
    `Group`,
    Amount,
    SUM(Amount) OVER (
        PARTITION BY `Group` 
        ORDER BY Id 
        ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
    ) AS PreviousAmount
FROM your_table;

注意:Group是SQL保留关键字,需要用反引号(MySQL)或方括号(SQL Server)包裹,避免语法错误。

方式二:累计总和减去当前行金额

利用分组内到当前行的累计总和,减去当前行的Amount,直接得到前序行的总和,逻辑更简洁:

SELECT
    Id,
    `Group`,
    Amount,
    SUM(Amount) OVER (PARTITION BY `Group` ORDER BY Id) - Amount AS PreviousAmount
FROM your_table;

这两种方案都基于窗口函数实现,只需要对表进行一次扫描,性能远优于自关联等传统方法,同时代码可读性强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:22:44