PostgreSQL如何对多组日期计算前n天滑动及当月累计求和
PostgreSQL 滑动求和与月度累计求和实现方案
首先默认原始数据表结构如下,你可以根据自己的实际表结构替换对应名称:
- 表名:
original_data - 字段1:
dt DATE存储日期 - 字段2:
val INT存储对应统计数值
1. 计算当日及此前4天的数值总和(近5天滑动总和)
使用窗口函数实现,支持自动处理日期断档场景,计算结果存储为独立表rolling_5d_sum,实现语句如下:
CREATE TABLE rolling_5d_sum AS SELECT dt, SUM(val) OVER ( ORDER BY dt RANGE BETWEEN INTERVAL '4 days' PRECEDING AND CURRENT ROW ) AS last_5d_total FROM original_data ORDER BY dt;
说明:如果你的日期数据完全连续无缺失,可将窗口逻辑替换为ROWS BETWEEN 4 PRECEDING AND CURRENT ROW,查询性能更优。
2. 计算月初到当日的累计数值总和(MTD累计)
通过月度分区窗口实现,计算结果存储为独立表mtd_sum,实现语句如下:
CREATE TABLE mtd_sum AS SELECT dt, SUM(val) OVER ( PARTITION BY DATE_TRUNC('month', dt) ORDER BY dt ) AS month_to_date_total FROM original_data ORDER BY dt;
说明:DATE_TRUNC('month', dt)会将日期统一截断为当月第一天,按该字段分区后累加即可得到同月份内从月初到当前日期的累计值,完全符合需求示例的计算规则。
如果你需要先验证计算结果是否符合预期,可以先去掉CREATE TABLE XXX AS部分,只运行SELECT查询查看结果,确认无误后再执行建表存储操作即可。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

