Задача:
Eсть набор интервалов, некоторые из которых могут
пересекаться. Нужно получить набор уникальных непересекающихся
интервалов, а для тех которые пересекаются - выбрать минимум и
максимум. Интервал - это ID+(Date1-Date2)
Решение (Artix www.user.su):
Шаг 1. Рекурсивно увеличиваем длину каждого интервала вправо на длину пересечения (если оно есть)
Шаг 2. Выбираем все самые длинные интервалы без пересечений слева
WITH RECURSIVE
Q AS (
SELECT
0 as LV,
T1.ID,
T1.DATE1 as DT1,
T1.DATE2 as DT2
FROM TESTX T1
ORDER BY 3,4
),
T (LV,ID,ROOT,DX1,DX2) AS (
SELECT
LV,ID,ID,
DT1,DT2
FROM Q M
UNION ALL
SELECT
LV+1,
T2.ID,
ROOT,
T2.DATE1 as DT1,
MAXVALUE(T2.DATE2, DX2) as DT2
FROM TESTX T2 INNER JOIN T ON
(T2.ID<>T.ID) AND (
(T2.DATE1 BETWEEN T.DX1 AND T.DX2) OR
(T2.DATE2 BETWEEN T.DX1 AND T.DX2)
) AND T2.DATE2>DX2
), V AS (
SELECT ROOT, MIN(DX1) as DM1, MAX(DX2) as DM2
FROM T GROUP BY ROOT
)
SELECT * FROM V X WHERE NOT EXISTS (
SELECT * FROM V Y WHERE (X.ROOT<>Y.ROOT)
AND (X.DM1 BETWEEN Y.DM1 AND Y.DM2)
)
#
SQL Справочник v0.05 © 2007-2025 Igor Salnikov aka SunDoctor