如何编写SQL查询获取分组内前序行累计金额(不含当前行)
编写SQL查询获取分组内前序行金额总和的最优方式
需求说明
需要实现SQL查询,达成以下目标:
获取当前行数据,同时计算出分组内当前行之前所有行的金额总和
假设存在一张表,包含Id、Group、Amount三个字段,预期查询结果如下:
| Id | Group | Amount | PreviousAmount* |
|---|---|---|---|
| 1 | 1 | 2 | NULL |
| 2 | 1 | 2 | 2 |
| 3 | 1 | 2 | 4 |
| 4 | 2 | 2 | NULL |
尝试的问题
我原本写了如下查询:
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
相关产品推荐
相关产品推荐

