You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;

逻辑说明:

  1. 外层查询遍历每一行数据,作为当前基准行
  2. 子查询针对当前行的Group,筛选出所有创建日期在当前行创建日期往前12个月到当前日期范围内的记录
  3. 用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;

逻辑说明:

  1. PARTITION BY "Group":将数据按组拆分,每组独立计算
  2. ORDER BY TO_DATE(Creation_Date, 'YYYYMM'):按创建日期排序,确保窗口范围的正确性
  3. RANGE BETWEEN INTERVAL '12' MONTH PRECEDING AND CURRENT ROW:定义统计窗口为当前行日期往前推12个月,直到当前行的范围
  4. COUNT(*)计算该窗口内的元素数量

注意事项:

  • Group是Oracle的保留关键字,所以查询时需要用双引号"Group"包裹列名,或者修改该列的名称避免冲突
  • 如果你需要统计的不是元素数量,而是某个数值字段的总和,只需要把COUNT(*)替换为SUM(your_numeric_column)即可
  • 确保Creation_Date字段的格式严格是YYYYMM,否则TO_DATE转换会报错

用你的示例数据测试这两种方法,都会得到你期望的结果:

Element_IdCreation_DateGroupSum_In_Reference_Period
E20200111
F20200212
G20200313
A20210113
D20210213
B20210121
C20210131

内容的提问来源于stack exchange,提问作者Thalles Machado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 20:39:05