Строки раздела, в которых даты находятся между предыдущими датами

#sql #oracle #window-functions

#sql #Oracle #окно-функции

Вопрос:

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

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

*edit Я хотел бы удалить строку с наименьшим количеством дней между начальной и конечной датой, где эти строки перекрываются.

Пример:

pgid 1 amp; 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    
  

Ответ №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. @MrJohn . . . Есть причина, по которой вы не приняли этот ответ?

2. Не уверен, что ответ соответствует моим потребностям. В настоящее время я рассматриваю более подробно.

Ответ №2:

Возможно, 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