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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:24:03