如何证明 oracle sql 中组内的重叠日期

how to proof for overlapping Dates within groups in oracle sql

提问人:Roberto Amaro 提问时间:8/8/2023 最后编辑:MT0Roberto Amaro 更新时间:8/8/2023 访问量:19

问:

我正在使用 oracle SQL Developer 21.4.3 尝试在没有重叠日期的组内选择记录,但是我还没有找到执行此操作的方法。这是表格的一个例子,我们必须设置日期,在表格中创建记录的技术日期(DATE_FROM和DATE_TO)和产品的到期日期(VALID_FROM,VALID_TO)

示例(have)

钥匙 类型 DATE_FROM DATE_TO VALID_FROM VALID_TO
123456 一个 10/31/22 12/31/99 12/31/11 02/28/25
123456 B 30/09/22 12/31/99 10/31/22 02/28/25
123456 C 10/31/22 12/31/99 02/28/25 08/31/35

这里 TYPE A 和 B 的到期日期是重叠的,最后我只想保留 TYPE A 和 C 的记录,因为它们使用 VALID_FROM 和 VALID_TO构建了一个连续的范围。

示例 (want)

钥匙 类型 DATE_FROM DATE_TO VALID_FROM VALID_TO
123456 一个 10/31/22 12/31/99 12/31/11 02/28/25
123456 C 10/31/22 12/31/99 02/28/25 08/31/35

我尝试使用ROW_NUMBER by(PARTITION和ORDER BY)功能来识别正确的记录,但到目前为止还没有奏效

感谢您的帮助

Oracle Group-by 重叠匹配

评论

0赞 MT0 8/8/2023
假设您的日期格式是,则 type 具有无效的 .MM/DD/YYBDATE_FROM
0赞 MT0 8/8/2023
Oracle SQL Developer 是用于与数据库通信的客户端应用程序;它不是数据库,客户端应用程序的版本与问题无关(通常,您使用的客户端应用程序也与问题无关)。您需要告诉我们的是您要连接到的 Oracle 数据库的版本。

答:

0赞 MT0 8/8/2023 #1

从 Oracle 12 开始,您可以使用执行逐行模式匹配并查找每个匹配项的第一行(用于不输出重叠后的连续行):MATCH_RECOGNIZE{- -}

SELECT *
FROM   table_name
MATCH_RECOGNIZE(
  ORDER BY valid_from, valid_to DESC
  ALL ROWS PER MATCH
  PATTERN ( overlapping {- overlapping* not_overlapping -} | not_overlapping )
  DEFINE
    overlapping AS MAX(valid_to) > NEXT(valid_from)
)

其中,对于示例数据(固定类型值):BDATE_FROM

CREATE TABLE table_name (KEY, TYPE, DATE_FROM, DATE_TO, VALID_FROM, VALID_TO) AS
SELECT 123456, 'A', DATE '2022-10-31', DATE '2099-12-31', DATE '2011-12-31', DATE '2025-02-28' FROM DUAL UNION ALL
SELECT 123456, 'B', DATE '2022-03-09', DATE '2099-12-31', DATE '2022-10-31', DATE '2025-02-28' FROM DUAL UNION ALL
SELECT 123456, 'C', DATE '2022-10-31', DATE '2099-12-31', DATE '2025-02-28', DATE '2035-08-31' FROM DUAL;

输出:

VALID_FROM VALID_TO 钥匙 类型 DATE_FROM DATE_TO
2011-12-31 00:00:00 2025-02-28 00:00:00 123456 一个 2022-10-31 00:00:00 2099-12-31 00:00:00
2025-02-28 00:00:00 2035-08-31 00:00:00 123456 C 2022-10-31 00:00:00 2099-12-31 00:00:00

小提琴