Строки секций, где даты находятся между предыдущими датами - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть таблица ниже.

Я хочу определить перекрывающиеся интервалы start_date и end_date.

*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 ]

1 голос
/ 01 апреля 2019

Я думаю 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;
0 голосов
/ 02 апреля 2019

Может быть lead и lag:

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
...