如何在PostgreSQL中按条件重置累计值并重新聚合
实现带重置的累计求和(reset_date为true时重置累计)
需求是生成cumulative_point列:该列是point的累计值,每当reset_date为true时,累计值重置,不再继承之前的累计结果。
你之前尝试的SQL语句:
SUM(CASE WHEN reset_date then 0 ELSE point END) as cumulative_point
无法正确重置,因为普通的SUM会持续累加所有符合条件的行,没有区分重置后的独立分组。
正确实现方法
核心思路是先按重置点对数据分组,再在每个分组内做累计求和:
- 生成分组ID:通过累计
reset_date为true的次数,给每个重置后的连续行分配同一个分组ID - 在分组内按日期排序,累计
point值
完整SQL语句:
SELECT date, point, reset_date, SUM(point) OVER (PARTITION BY group_id ORDER BY date) AS cumulative_point FROM ( SELECT *, -- 累计reset_date为true的次数,生成分组ID SUM(CASE WHEN reset_date THEN 1 ELSE 0 END) OVER (ORDER BY date) AS group_id FROM your_table_name ) AS grouped_data ORDER BY date;
验证结果
执行上述SQL后,会得到符合需求的结果:
| date | point | reset_date | cumulative_point |
|---|---|---|---|
| 2019-01-01 00:00:00 | 1 | true | 1 |
| 2019-01-02 00:00:00 | 3 | false | 4 |
| 2019-01-03 00:00:00 | 1 | false | 5 |
| 2019-01-04 00:00:00 | 2 | false | 7 |
| 2019-01-05 00:00:00 | 1 | true | 1 |
| 2019-01-06 00:00:00 | 4 | false | 5 |
| 2019-01-07 00:00:00 | 2 | false | 7 |
内容的提问来源于stack exchange,提问作者Taishi Kato
相关产品推荐
相关产品推荐

