提问人:Roberto Amaro 提问时间:8/8/2023 最后编辑:MT0Roberto Amaro 更新时间:8/8/2023 访问量:19
如何证明 oracle sql 中组内的重叠日期
how to proof for overlapping Dates within groups in oracle sql
问:
我正在使用 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)功能来识别正确的记录,但到目前为止还没有奏效
感谢您的帮助
答:
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)
)
其中,对于示例数据(固定类型值):B
DATE_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 |
评论
MM/DD/YY
B
DATE_FROM