#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