使用两个日期列创建新行并重复总和值
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_ini
和date_fin
重新创建日期值介于date_ini
和date_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中的数据集:对于两个数据集中的每个值,在第三个数据集中创建一个新行[重复]