【问题标题】:Sum of all matching elements inside a time frame that changes according to the element in SQL根据 SQL 中的元素变化的时间范围内所有匹配元素的总和
【发布时间】:2021-10-19 08:39:00
【问题描述】:

我在这里问这个问题之前搜索了很多,但找不到与我的问题相关的任何内容。

我目前正在尝试从我的 Oracle SQL 数据库中检索一个特定的值(我们称之为“参考期间的总和”)。

我有不同的元素链接到一个组(例如,元素 A 来自第 1 组,元素 B 来自第 2 组,元素 C 来自第 3 组,等等),并且每个元素都有创建日期以下格式:YYYYMM。

如何创建一个附加列,其中包含与行中元素属于同一组且在元素创建后的过去 12 个月内创建的所有元素的总和?

假设我当前的表如下所示:

| Element_Id | Creation_Date | Group |
| A          | 202101        | 1     |
| B          | 202101        | 2     |
| C          | 202101        | 3     |
| D          | 202102        | 1     |
| E          | 202001        | 1     |
| F          | 202002        | 1     |
| G          | 202003        | 1     |

我想要的结果是:

| Element_Id | Creation_Date | Group | Sum_In_Reference_Period |
| A          | 202101        | 1     | 3                       |
| B          | 202101        | 2     | 1                       | 
| C          | 202101        | 3     | 1                       |
| D          | 202102        | 1     | 3                       |
| E          | 202001        | 1     | 1                       |
| F          | 202002        | 1     | 2                       |
| G          | 202003        | 1     | 3                       |

提前谢谢你。

【问题讨论】:

  • 对不起...我将在问题中添加一个示例
  • DAG 都在同一个组中并且在D 之前不到12 个月时,为什么D 的总和是2创建日期?
  • 对不起,这是我的错误,我改了

标签: sql oracle


【解决方案1】:

使用窗口分析函数:

SELECT t.*,
       COUNT(*) OVER (
         PARTITION BY grp
         ORDER BY TO_DATE(Creation_Date || '01', 'YYYYMMDD')
         RANGE BETWEEN INTERVAL '11' MONTH PRECEDING AND INTERVAL '0' MONTH FOLLOWING
       ) AS sum_in_reference_period
FROM   table_name t
ORDER BY element_id

其中,对于您的示例数据:

CREATE TABLE table_name (Element_Id, Creation_Date, Grp) AS
SELECT 'A', 202101, 1 FROM DUAL UNION ALL
SELECT 'B', 202101, 2 FROM DUAL UNION ALL
SELECT 'C', 202101, 3 FROM DUAL UNION ALL
SELECT 'D', 202102, 1 FROM DUAL UNION ALL
SELECT 'E', 202001, 1 FROM DUAL UNION ALL
SELECT 'F', 202002, 1 FROM DUAL UNION ALL
SELECT 'G', 202003, 1 FROM DUAL;

输出:

ELEMENT_ID CREATION_DATE GRP SUM_IN_REFERENCE_PERIOD
A 202101 1 3
B 202101 2 1
C 202101 3 1
D 202102 1 3
E 202001 1 1
F 202002 1 2
G 202003 1 3

db小提琴here

【讨论】:

  • 非常感谢。这非常适合我的情况。
猜你喜欢
  • 2019-05-14
  • 2020-06-19
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 2022-01-16
  • 2017-02-24
  • 2022-10-21
  • 1970-01-01
相关资源
最近更新 更多