SQL Server 2019如何去除嵌套聚合子查询实现支付前余额计算
SQL Server 2019 重写方案
直接使用SUM窗口聚合函数即可实现,相比原相关子查询写法执行效率更高,数据量较大时性能优势尤为明显:
SELECT Id, UserId, Amount, PayDate, ISNULL(SUM(Amount) OVER ( PARTITION BY UserId ORDER BY PayDate ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ), 0) AS Balance FROM Payments
逻辑说明
PARTITION BY UserId:按用户ID拆分计算分组,每个用户的余额单独统计互不干扰ORDER BY PayDate:同一用户内按支付时间正序排列,保证累加顺序符合业务逻辑ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING:指定累加范围为当前行之前的所有行,排除本次支付金额,刚好匹配「支付前余额」的需求- 外层包
ISNULL(...,0):处理用户首次支付时没有前置充值记录的场景,返回0和需求示例结果完全对齐
注意事项
如果你的PayDate字段是字符串类型存储,需要先转为日期类型再排序,避免字符串排序不符合预期。你给出的日期格式为DD.MM.YY,可以用如下写法转换:
ORDER BY CONVERT(DATE, PayDate, 104)
内容的提问来源于stack exchange,提问作者Timofeus
相关产品推荐
相关产品推荐

