如何按Contract分组、Year排序计算Paid列的累计总和?
按合同分组、年份排序的累计付费金额计算方案
正确SQL实现
直接使用带ORDER BY的窗口聚合函数即可实现跨多行的累计求和,无需手动用LAG迭代:
SELECT Contract, [Year], Paid, SUM(Paid) OVER ( PARTITION BY Contract ORDER BY [Year] -- 以下子句可省略,多数SQL引擎在ORDER BY后默认采用此范围 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS SUMPaid FROM YourTable;
方案说明
PARTITION BY Contract:限定仅在同一合同分组内计算累计值ORDER BY [Year]:指定累计的顺序为年份升序,确保按时间先后累加SUM(Paid) OVER (...):对当前行及分组内所有之前行的Paid值求和,自动处理任意年份数量的合同数据
之前方案的问题分析
- 仅用
SUM(Paid) OVER (PARTITION BY Contract):会直接计算整个合同分组的总付费,而非按年份的累计值 Paid + LAG(Paid,1) OVER (...):仅能累加当前行与上一行的值,无法自动迭代累加所有历史行,因此合同年份超过2年时无法得到正确的累计总和
内容的提问来源于stack exchange,提问作者Ivan Nel
相关产品推荐
相关产品推荐

