MS SQL如何取首行total值累加后续margin值并替换原total列?
问题:基于首行Total值累加Margin生成新Total列(MS SQL)
原始查询结果表
| total | margin | date |
|---|---|---|
| 45 | -1 | 2022-01 |
| 45 | 0 | 2022-02 |
| 45 | 0 | 2022-03 |
| 45 | 1 | 2022-04 |
| 45 | -1 | 2022-05 |
| 45 | 0 | 2022-06 |
需求说明
取首行的total值,每行累加对应margin值来替换原total列,忽略其他行的原始total值,期望结果如下:
期望结果表
| total | margin | date |
|---|---|---|
| 44 | -1 | 2022-01 |
| 44 | 0 | 2022-02 |
| 44 | 0 | 2022-03 |
| 45 | 1 | 2022-04 |
| 44 | -1 | 2022-05 |
| 44 | 0 | 2022-06 |
尝试过的方法及问题
曾使用LAG函数,但该函数无法追踪累计变化(例如第四行取到的是前一行原始值45,而非累计后的44),无法满足需求。
解决方案
通过以下SQL语句实现需求:
first_value(total) over(order by [date] ROWS UNBOUNDED PRECEDING) + sum(margin) over(order by [date] ROWS UNBOUNDED PRECEDING) as total
原理说明
first_value(total) over(order by [date] ROWS UNBOUNDED PRECEDING):获取按date排序后的首行total值(即45),所有行都返回该值sum(margin) over(order by [date] ROWS UNBOUNDED PRECEDING):计算从首行到当前行的margin累计和- 两者相加得到基于首行
total累加累计margin后的新total值,完全匹配需求
内容的提问来源于stack exchange,提问作者Domantas Puišys
相关产品推荐
相关产品推荐

