如何按xAccID分组累加当前行与上一行的xRaseed字段值
按账户维度的滚动累计值计算实现
核心计算规则
- 分组边界:以
xAccID为分区维度,同一账户的所有记录独立开展累计计算,不跨账户累加 - 排序前提:组内必须按
xYear、xMonth升序(时间正序)排列,这是累计值计算的核心基础,否则结果会完全不符合预期 - 累计逻辑:组内时间最早的第一行,累计值等于自身的
xRaseed值;后续每一行的累计值 = 自身xRaseed值 + 同账户上一个时间节点的累计值
可直接运行的通用SQL实现
基于SQL标准的窗口函数实现,兼容MySQL 8.0+、PostgreSQL、SQL Server、Oracle等所有主流数据库:
SELECT xType, xAccID, xAccName, xCat, xYear, xMonth, -- 计算分区内按时间排序的累计余额 SUM(xRaseed) OVER ( PARTITION BY xAccID ORDER BY xYear, xMonth ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS xRaseed FROM 你的业务数据表名 -- 匹配示例中的展示顺序:同一账户内时间倒序排列 ORDER BY xAccID, xYear DESC, xMonth DESC
样例数据结果核对
对照给出的业务数据,计算结果与预期完全匹配:
- 账户52(Acc1):
- 2020年11月(组内最早时间节点):累计值 = 3144.83
- 2020年12月:累计值 = 3144.83 + (-15199.64) = -12054.81
- 账户53(Acc2):
- 2020年11月(组内最早时间节点):累计值 = 1090.64
- 2020年12月:累计值 = 1090.64 + 5306.04 = 6396.68
常见踩坑提醒
- 不要直接使用表的原始写入顺序做累加:原始数据的写入顺序不一定和时间顺序一致,比如样例中Acc2的12月记录是先写入的、11月记录是后补的,如果不按时间字段排序计算,后续补录更早/更晚的月份数据时,累计值会完全错乱
- 若使用的是不支持窗口函数的老旧数据库版本,可通过自连接关联同账户下所有时间早于当前行的记录求和实现,但计算效率远低于窗口函数,不适合大数据量场景
内容的提问来源于stack exchange,提问作者Hamada
相关产品推荐
相关产品推荐

