SQLite: объединение интервалов


Задача:

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

#