PostgreSQL按类型和周多列分组计算累计求和问题
正确的按类型分组累计求和方法
原查询的问题在于窗口函数未按type进行分区,导致计算的是全局累计值而非单个类型的累计。要实现每个类型按周的累计求和,需要在窗口函数中添加PARTITION BY type子句,确保累计范围限定在同一类型内。
正确查询语句
SELECT week, type, cnt, SUM(cnt) OVER (PARTITION BY type ORDER BY week) AS running_total FROM ( SELECT week, type, COUNT(*) AS cnt FROM customer GROUP BY week, type ) t ORDER BY week, type;
预期结果
| week | type | cnt | running_total |
|---|---|---|---|
| 2022-01 | A | 1 | 1 |
| 2022-01 | B | 1 | 1 |
| 2022-02 | A | 1 | 2 |
| 2022-02 | B | 2 | 3 |
说明
PARTITION BY type:将数据按类型分组,每个类型单独计算累计值ORDER BY week:确保累计是按时间顺序从最早的周开始计算- 子查询先统计每周每个类型的记录数,外层查询基于这个结果计算累计
内容的提问来源于stack exchange,提问作者Amzar
相关产品推荐
相关产品推荐

