oracle中跨行的日期范围的交集。
我有一个包含以下记录的表
| 项目编号|项目类型|活动源|主动到|规则ID|
| - -----|- -----|- -----|- -----|- -----|
| 10001| SAR| 2020-01-01 2020-01-01| 2023-01-01|规则1|
| 10001| SAR。|2024-01-01 2024-01-01| 9999-12-31|规则1|
| 10001| SAR| 2020-05-01 2020-05-01| 2021-06-01 2021-06-01 2021-06-01|规则2|
| 10001| SAR| 2021-01-01 2021- 01-01| 2021-02-01 2021-02-01|规则2|
我们需要找到规则ID之间的共同日期
输出将为
| 项目编号|项目类型|活动源|主动到|
| - -----|- -----|- -----|- -----|
| 10001| SAR| 2020-05-01 2020-05-01| 2021-06-01 2021-06-01 2021-06-01|
我尝试用连接级别来生成日期,然后取交集,但由于9999-12-31,它运行了很长时间
2条答案
按热度按时间fwzugrvs1#
在Oracle 12中,您可以
UNPIVOT
日期,然后使用分析函数和MATCH_RECOGNIZE
逐行处理结果集,以查找两个规则都处于活动状态的连续行:其中,对于样本数据:
输出:
| 项目编号|项目类型|ACTIVE_FROM| ACTIVE_TO|
| - -----|- -----|- -----|- -----|
| 10001| SAR| 2020-05-01 00:00:00| 2019 -06-01 00:00:00|
并用于:
输出为:
| 项目编号|项目类型|ACTIVE_FROM| ACTIVE_TO|
| - -----|- -----|- -----|- -----|
| 10001| SPR| 2019 -01- 21 00:00:00| 2019 -01- 21 00:00:00|
fiddle
xn1cxnb42#
您要查找的是同一项的重叠日期范围,但规则不同。
两个日期范围A和B何时重叠?答案:当start(B)<= end(A)AND end(B)>= start(A)时。有了这些知识,我们就可以加入。重叠范围仅为较大的开始日期到较小的结束日期。