PostgreSQL按属性、年月分组计算年内滚动累计聚合值(AVG等)实现求助
实现方案
直接使用标准窗口函数即可满足需求,参考SQL如下:
SELECT field1, field2, year, month, kpi, AVG(kpi) OVER ( PARTITION BY field1, field2, year ORDER BY month ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS kpi_yr_avg FROM 你的表名;
逻辑说明
PARTITION BY field1, field2, year:按业务字段、年份分组,不同分组的计算完全独立,符合同field1、field2、同年度计算的要求ORDER BY month ASC:分组内按月份从小到大排序,保证计算顺序是从1月往12月递进ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:指定窗口计算范围是当前分组的第一行到当前行,也就是对应年份的1月到当前记录的月份,刚好匹配累计平均规则
如果你的数据集存在月份缺失的情况,建议先生成完整的年月维度表,和业务表左关联补全空缺月份的kpi值后再执行以上计算,避免缺月导致累计范围不符合预期。
内容的提问来源于stack exchange,提问作者FrankBlack78
相关产品推荐
相关产品推荐

