如何在Oracle SQL中新增列计算同组元素创建日期过去12个月内的匹配元素总和
解决Oracle中同组过去12个月元素统计的问题
这是一个典型的滑动窗口统计需求,针对你的场景,我提供两种在Oracle SQL中可行的实现方案,都能满足你新增Sum_In_Reference_Period列的需求:
方法1:关联子查询(直观易懂)
这种写法逻辑清晰,适合对SQL关联查询熟悉的场景:
SELECT t.Element_Id, t.Creation_Date, t."Group", (SELECT COUNT(*) FROM your_table s WHERE s."Group" = t."Group" AND TO_DATE(s.Creation_Date, 'YYYYMM') BETWEEN ADD_MONTHS(TO_DATE(t.Creation_Date, 'YYYYMM'), -12) AND TO_DATE(t.Creation_Date, 'YYYYMM')) AS Sum_In_Reference_Period FROM your_table t ORDER BY t."Group", t.Creation_Date;
逻辑说明:
- 外层查询遍历每一行数据,作为当前基准行
- 子查询针对当前行的
Group,筛选出所有创建日期在当前行创建日期往前12个月到当前日期范围内的记录 - 用
COUNT(*)统计符合条件的元素数量,也就是你要的Sum_In_Reference_Period
方法2:窗口函数(高效性能优)
如果你的数据量较大,窗口函数的性能会更出色,这也是Oracle推荐的滑动统计写法:
SELECT Element_Id, Creation_Date, "Group", COUNT(*) OVER ( PARTITION BY "Group" ORDER BY TO_DATE(Creation_Date, 'YYYYMM') RANGE BETWEEN INTERVAL '12' MONTH PRECEDING AND CURRENT ROW ) AS Sum_In_Reference_Period FROM your_table ORDER BY "Group", Creation_Date;
逻辑说明:
PARTITION BY "Group":将数据按组拆分,每组独立计算ORDER BY TO_DATE(Creation_Date, 'YYYYMM'):按创建日期排序,确保窗口范围的正确性RANGE BETWEEN INTERVAL '12' MONTH PRECEDING AND CURRENT ROW:定义统计窗口为当前行日期往前推12个月,直到当前行的范围COUNT(*)计算该窗口内的元素数量
注意事项:
Group是Oracle的保留关键字,所以查询时需要用双引号"Group"包裹列名,或者修改该列的名称避免冲突- 如果你需要统计的不是元素数量,而是某个数值字段的总和,只需要把
COUNT(*)替换为SUM(your_numeric_column)即可 - 确保
Creation_Date字段的格式严格是YYYYMM,否则TO_DATE转换会报错
用你的示例数据测试这两种方法,都会得到你期望的结果:
| Element_Id | Creation_Date | Group | Sum_In_Reference_Period |
|---|---|---|---|
| E | 202001 | 1 | 1 |
| F | 202002 | 1 | 2 |
| G | 202003 | 1 | 3 |
| A | 202101 | 1 | 3 |
| D | 202102 | 1 | 3 |
| B | 202101 | 2 | 1 |
| C | 202101 | 3 | 1 |
内容的提问来源于stack exchange,提问作者Thalles Machado
相关产品推荐
相关产品推荐

