按日期与ID排序聚合账户余额的SQL查询问题
解决逐行累加账户余额的SQL查询问题
你的核心问题是原查询会把同一OpenDate的所有记录批量求和,而非按指定排序逐行累加。用窗口函数SUM() OVER()可以精准解决这个需求,以下是正确的SQL写法:
SELECT AccountNumber, ID, OpenDate, Balance, AvailableCredit, (Balance + AvailableCredit) AS TotalBalance, SUM(Balance + AvailableCredit) OVER ( PARTITION BY AccountNumber ORDER BY OpenDate ASC, ID DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS Aggregate FROM YourTable; -- 替换为实际表名,避免使用关键字`Table`
关键说明:
PARTITION BY AccountNumber:限定仅对同一用户的账户记录进行累加计算ORDER BY OpenDate ASC, ID DESC:严格遵循排序要求——先按开户日期从旧到新,同一日期下按ID从高到低排序ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:明确累计范围是从当前用户的第一条记录到当前行,确保逐行累加而非批量求和(部分数据库默认此规则,但显式声明更稳妥)
原查询的问题在于子查询仅用T2.OpenDate <= OpenDate作为条件,会将同一日期的所有记录全部纳入求和范围,导致同日期的Aggregate结果直接批量相加,而非按ID排序逐行累加。窗口函数通过指定排序规则,能让累计计算严格按照你需要的顺序执行。
内容的提问来源于stack exchange,提问作者user423605
相关产品推荐
相关产品推荐

