计算累计值时出现重复,求SQL实现日期累计求和的正确方案
解决SQL累计值计算中的重复数据问题
问题原因
你当前的SQL使用窗口函数SUM(Value) OVER (PARTITION BY Date)时,会为原始表中的每一行返回当日的总和,所以原始表中同一日期有多行时,结果就会出现重复行。
解决方案
要实现「先按日期汇总当日数值,再累加之前所有日期总值」的需求,分两步处理即可:
步骤1:按日期聚合每日总和
通过GROUP BY Date将同一日期的Value求和,得到每个日期唯一的当日总值:
SELECT Date, SUM(Value) AS daily_total FROM your_table GROUP BY Date ORDER BY Date;
这一步的输出结果:
| Date | daily_total |
|---|---|
| 2021-01-01 00:00:00 | 20 |
| 2021-01-02 00:00:00 | 50 |
| 2021-01-03 00:00:00 | 30 |
步骤2:基于每日总和计算累计值
将第一步的结果作为子查询,使用窗口函数SUM(daily_total) OVER (ORDER BY Date)按日期顺序累加每日总值:
SELECT Date, SUM(daily_total) OVER (ORDER BY Date) AS cumulative_value FROM ( SELECT Date, SUM(Value) AS daily_total FROM your_table GROUP BY Date ) AS daily_sums ORDER BY Date;
最终结果
执行上述SQL后,就能得到你期望的无重复累计值结果:
| Date | cumulative_value |
|---|---|
| 2021-01-01 00:00:00 | 20 |
| 2021-01-02 00:00:00 | 70 |
| 2021-01-03 00:00:00 | 100 |
补充说明
如果不想用子查询,也可以用DISTINCT直接去重,但这种方式效率不如先聚合(窗口函数需要处理原始表所有行后再去重),示例如下:
SELECT DISTINCT Date, SUM(SUM(Value)) OVER (ORDER BY Date) AS cumulative_value FROM your_table GROUP BY Date;
内容的提问来源于stack exchange,提问作者droscar
相关产品推荐
相关产品推荐

