如何查询:在Oracle SQL中填充空白并修复重叠的日期范围
CREATE TABLE PROD_TABLE(Assignment_ID number, Effective_START_Date date, Effective_END_Date date, DEPARTMENT VARCHAR2(100));
INSERT INTO PROD_TABLE VALUES (30001, TO_DATE('1/1/2020', 'MM/DD/YYYY'), TO_DATE('2/1/2020', 'MM/DD/YYYY'), 'DEPT1');
INSERT INTO PROD_TABLE VALUES (30001, TO_DATE('2/2/2020', 'MM/DD/YYYY'), TO_DATE('2/2/2021', 'MM/DD/YYYY'), 'DEPT1');
INSERT INTO PROD_TABLE VALUES (30001, TO_DATE('2/3/2021', 'MM/DD/YYYY'), TO_DATE('3/19/2021', 'MM/DD/YYYY'), 'DEPT1');
INSERT INTO PROD_TABLE VALUES (30001, TO_DATE('3/20/2023', 'MM/DD/YYYY'), TO_DATE('12/31/4712', 'MM/DD/YYYY'), 'DEPT1');
CREATE TABLE STAGING_TABLE(Assignment_ID number, Effective_START_Date date, Effective_END_Date date, DEPARTMENT VARCHAR2(100));
INSERT INTO STAGING_TABLE VALUES (30001, TO_DATE('2/2/2020', 'MM/DD/YYYY'), TO_DATE('5/4/2020', 'MM/DD/YYYY'), 'DEPT1');
INSERT INTO STAGING_TABLE VALUES (30001, TO_DATE('5/5/2020', 'MM/DD/YYYY'), TO_DATE('2/2/2021', 'MM/DD/YYYY'), 'DEPT1');
在STAGING_TABLE中,有两条记录与PROD_TABLE中的记录重叠。分期记录:1.开始日期:2/2/2020结束日期:5/4/2020
2.开始日期:2020年5月5日结束日期:2/2/2021
PROD_TABLE:上面的记录与记录1重叠。开始日期:2/2/2020结束日期:2/2/2021
因此,希望将STAGING_TABLE记录合并到PROD_TABLE记录中。合并后,预期记录应为1。开始日期:2/2/2020结束日期:5/4/2020 2.开始日期:2020年5月5日结束日期:2/2/2021
这是我到目前为止创建的查询。有没有简单的方法可以做到这一点?
WITH query1 AS ( SELECT prod_table.Assignment_ID,
GREATEST(staging_table.effective_start_date, prod_table.effective_start_date) AS effective_START_date,
LEAST(staging_table.effective_end_date, prod_table.effective_end_date) AS effective_END_date,
staging_table.DEPARTMENT FROM PROD_TABLE prod_table,
STAGING_TABLE staging_table WHERE prod_table.Assignment_ID = staging_table.Assignment_ID AND prod_table.effective_start_date <
staging_table.effective_end_date AND prod_table.effective_end_date
> staging_table.effective_start_date ) SELECT * FROM query1 UNION SELECT prod_table.Assignment_ID,
prod_table.effective_start_date,
prod_table.effective_end_date,
prod_table.DEPARTMENT FROM PROD_TABLE prod_table WHERE NOT EXISTS (SELECT 1
FROM query1 qry
WHERE prod_table.Assignment_ID = qry.Assignment_ID
AND prod_table.effective_start_date BETWEEN qry.effective_start_date AND qry.effective_end_date) ORDER BY 1, 2;
1条答案
按热度按时间balp4ylt1#
如果要替换
PROD_TABLE
中完全包含STAGING_TABLE
中的行的行,则可以使用MERGE
语句:其中,对于样本数据,在
MERGE
之后,然后prod_table
包含:| 分配ID|生效日期|生效结束日期|联系方式|
| --------------|--------------|--------------|--------------|
| 30001|2020-01-01 00:00:00|2020-02-01 00:00:00|DEPT1|
| 30001|2020-02-02 00:00:00|2020-05-04 00:00:00|DEPT1|
| 30001|2019 -02-03 00:00:00|2021-03-19 00:00:00|DEPT1|
| 30001|2019 -03-20 00:00:00|2019 - 01 -12 00:00:00|DEPT1|
| 30001|2020-05-05 00:00:00|2019 -02- 22 00:00:00|DEPT1|
更新:
如果你想要
SELECT
(而不是MERGE
)来自staging_table
的所有数据和prod_table
的数据没有完全包围staging_table
的行,那么使用UNION ALL
和NOT EXISTS
:其输出:
| 分配ID|生效日期|生效结束日期|联系方式|
| --------------|--------------|--------------|--------------|
| 30001|2020-01-01 00:00:00|2020-02-01 00:00:00|DEPT1|
| 30001|2019 -02-03 00:00:00|2021-03-19 00:00:00|DEPT1|
| 30001|2019 -03-20 00:00:00|2019 - 01 -12 00:00:00|DEPT1|
| 30001|2020-02-02 00:00:00|2020-05-04 00:00:00|DEPT1|
| 30001|2020-05-05 00:00:00|2019 -02- 22 00:00:00|DEPT1|
fiddle