如何计算滚动结余?为Table2生成Running Balance列的方法
计算项目滚动结余(初始结余扣减累计消耗)
现有两张数据表:
- Table1:存储各项目的初始结余,包含
Item(项目)和Balance(初始结余)字段 - Table2:记录各项目的消耗数据,包含
Item(项目)和consume(消耗量)字段
需要为Table2新增滚动结余列,计算逻辑为:项目初始Balance减去该项目当前及之前所有记录的累计consume,结果允许为负数(表示缺货)。
原表数据
Table 1(初始结余表)
| Item | Balance |
|---|---|
| A | 100 |
| B | 200 |
| C | 500 |
Table 2(消耗记录表)
| Item | consume |
|---|---|
| A | 10 |
| A | 20 |
| A | 20 |
| B | 120 |
| B | 100 |
| C | 100 |
| C | 100 |
| C | 200 |
预期结果
| Item | consume | 滚动结余 |
|---|---|---|
| A | 10 | 90 |
| A | 20 | 70 |
| A | 20 | 50 |
| B | 120 | 80 |
| B | 100 | -20 |
| C | 100 | 400 |
| C | 100 | 300 |
| C | 200 | 100 |
实现代码(SQL示例)
利用窗口函数实现分组累计计算,关联两张表后按项目分组统计累计消耗,再用初始结余减去累计值得到滚动结余:
SELECT t2.Item, t2.consume, t1.Balance - SUM(t2.consume) OVER (PARTITION BY t2.Item ORDER BY (SELECT NULL)) AS 滚动结余 FROM Table2 t2 INNER JOIN Table1 t1 ON t2.Item = t1.Item;
说明:如果Table2中有记录顺序的字段(如时间戳
create_time),建议将ORDER BY (SELECT NULL)替换为该字段,保证累计顺序准确。
内容的提问来源于stack exchange,提问作者Bryan Jun
相关产品推荐
相关产品推荐

