oracle 将第一个表的每个日期范围与第二个表的日期范围的所有行进行比较,以从第一个表中获得不重叠的日期范围

xv8emn3q  于 2023-03-29  发布在  Oracle
关注(0)|答案(1)|浏览(167)

我试过加入和所有,但它是行不通的

72qzrwbm

72qzrwbm1#

UNPIVOT日期,然后您可以使用分析函数来查找时间序列每个部分的边界,并使用每个表的开始和结束数量之间的差异来计算重叠(和非重叠):

SELECT st, ed
FROM   (
SELECT dt as st,
       LEAD(dt) OVER (ORDER BY dt) - CASE LEAD(type) OVER (ORDER BY dt) WHEN 1 THEN 1 ELSE 0 END AS ed,
       SUM(CASE WHEN table_type = 1 THEN type ELSE 0 END) OVER (ORDER BY dt) AS num_range1,
       SUM(CASE WHEN table_type = 2 THEN type ELSE 0 END) OVER (ORDER BY dt) AS num_range2
FROM   (
  SELECT dt, type, 1 AS table_type
  FROM   table1
  UNPIVOT (dt FOR type IN (st1 AS 1, ed1 As -1))
  UNION ALL
  SELECT dt, type, 2
  FROM   table2
  UNPIVOT (dt FOR type IN (st2 AS 1, ed2 As -1))
  ORDER BY dt
)
)
WHERE  num_range1 > 0
AND    num_range2 = 0;

其中,对于示例数据:

CREATE TABLE table1 (st1, ed1) AS
SELECT DATE '2020-06-05', DATE '2020-08-15' FROM DUAL UNION ALL
SELECT DATE '2020-09-01', DATE '2020-09-15' FROM DUAL;

CREATE TABLE table2 (st2, ed2) AS
SELECT DATE '2020-05-01', DATE '2020-06-10' FROM DUAL UNION ALL
SELECT DATE '2020-07-01', DATE '2020-07-03' FROM DUAL UNION ALL
SELECT DATE '2020-08-01', DATE '2020-08-13' FROM DUAL;

输出:
| ST|艾德|
| --------------|--------------|
| 2020年6月10日00时00分|2020年6月30日00时00分|
| 2020年7月3日00时00分|2020年7月31日00时00分|
| 2020-08-13 00:00:00|2020-08-15 00:00:00|
| 2020年9月1日00时00分|2020-09-15 00:00:00|
fiddle

相关问题