使用两个日期列创建新行并重复总和值

Posted

技术标签:

【中文标题】使用两个日期列创建新行并重复总和值【英文标题】:create new rows using two date columns and repeating a sum value 【发布时间】:2020-04-14 08:19:19 【问题描述】:

进行此设置:

CREATE SEQUENCE  "SEQ_TABLE_3"  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 2206 NOCACHE  ORDER  NOCYCLE  NOKEEP  NOSCALE  GLOBAL ;

CREATE TABLE TABLE_3 ( 
     ID NUMBER DEFAULT SEQ_TABLE_3.nextval  NOT NULL
    ,DATE_INI   DATE NOT NULL
    ,DATE_FIN   DATE NOT NULL
    ,ELEMENTS   NUMBER
);


Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),3);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),2);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),1);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),5);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),4);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),6);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),9);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),1);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),2);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),4);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),5);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),6);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),2);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),7);
commit;

我正在尝试得到这个结果:

这个想法是让date_inidate_fin 重新创建日期值介于date_inidate_fin 之间的行以及所有elements 的总和。 老实说,我不知道如何开始

【问题讨论】:

您需要使用 SUM 和 GROUP BY 进行递归查询。 【参考方案1】:

您可以使用递归查询来做到这一点:

with cte(dates, date_ini, date_fin, sum_elements) as (
    select date_ini dates, date_ini, date_fin, sum(elements) sum_elements 
    from table_3
    group by date_ini, date_fin
    union all
    select dates + 1, date_ini, date_fin, sum_elements
    from cte
    where dates < date_fin
)
select * from cte

Demo on DB Fiddle

日期 | DATE_INI | DATE_FIN | SUM_ELEMENTS :-------- | :-------- | :-------- | ------------: 01-APR-19 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 2 月 2 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 3 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 4 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 5 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 6 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 7 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 8 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 9 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 10 日 | 01-APR-19 | 19 年 4 月 10 日 | 57

【讨论】:

【参考方案2】:

只需像下面这样的子查询重构也可以做到这一点。

The DEMO here

        WITH data
         AS (SELECT date_ini + column_value - 1 AS dates,
                    date_ini,
                    date_fin,
                    elements
             FROM   table_3
                    cross join TABLE(Cast(MULTISET (SELECT LEVEL
                                              FROM   dual
                                              CONNECT BY date_ini + LEVEL <=
                                                         date_fin + 1
                                                   )
                                          AS
         sys.ODCINUMBERLIST)))
    SELECT dates,
           date_ini,
           date_fin,
           SUM(elements)
    FROM   data
    GROUP  BY dates,
              date_ini,
              date_fin
    ORDER  BY dates,
              date_ini,
              date_fin; 

【讨论】:

以上是关于使用两个日期列创建新行并重复总和值的主要内容,如果未能解决你的问题,请参考以下文章

如何合并重复的行

合并R中的数据集:对于两个数据集中的每个值,在第三个数据集中创建一个新行[重复]

Google 表格 - 创建新行时自动替换值

获取不同记录的总和并在两个日期范围之间进行比较

Python Dataframe:如果日期在其他两个日期列之间,则创建新列并设置为 1

MySQL 加入日期列存在 1 个月的滞后和性能问题