在日期介于先前日期之间的分区行

时间:2019-04-01 14:23:47

标签: sql oracle window-functions

我有下表。

我想确定开始日期和结束日期的重叠间隔。

*edit我想删除在开始日期和结束日期之间天数最少的行,这些行重叠。

示例:

pgid 1 & pgid 2 have overlapping days. Remove the row that has the least amount of days between start_date and end_date.

表A

id   pgid  Start_date    End_date      Days
 1    1    8/4/2018      9/10/2018      37
 1    2    9/8/2018      9/8/2018        0
 1    3    10/29/2018    11/30/2018     32
 1    4    12/1/2018     sysdate        123    

预期结果:

 id   Start_date    End_date     Days
 1     8/4/2018      9/10/2018    37 
 1     10/29/2018    11/30/2018   32  
 1     12/1/2018     sysdate      123    

2 个答案:

答案 0 :(得分:1)

我在想exists

select t.*,
       (case when exists (select 1
                          from t t2
                          where t2.start_date < t.start_date and
                                t2.end_date > t.end_date and
                                t2.id = t.id 
                         )
             then 2 else 1
        end) as overlap_flag
from t;

答案 1 :(得分:0)

也许leadlag

SELECT 
CASE 
WHEN END_DATE > LEAD (START_DATE) OVER (PARTITION BY id ORDER BY START_DATE) THEN 1
WHEN START_DATE < LAG (END_DATE) OVER (PARTITION BY id ORDER BY START_DATE) THEN 1 
ELSE 0
END OVERLAP_FLAG
FROM A