Fusionner des intervalles de dates qui se chevauchent
Réduire des périodes chevauchantes en plages continues : on détecte un nouveau groupe quand le début dépasse le max des fins précédentes, puis on agrège par groupe.
Cas d'usage
Consolider des périodes de contrat, d'absence ou de réservation qui se recouvrent.
Prérequis
PostgreSQL, SQL Server 2012+
SQL
WITH ordered AS (
SELECT *,
MAX(end_date) OVER (
ORDER BY start_date
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
) AS prev_max_end
FROM reservations
), flagged AS (
SELECT *,
CASE WHEN prev_max_end IS NULL
OR start_date > prev_max_end
THEN 1 ELSE 0 END AS new_group
FROM ordered
), grouped AS (
SELECT *, SUM(new_group) OVER (ORDER BY start_date) AS grp
FROM flagged
)
SELECT MIN(start_date) AS merged_start, MAX(end_date) AS merged_end
FROM grouped
GROUP BY grp
ORDER BY merged_start;Résultat
merged_start | merged_end --------------+------------ 2026-06-01 | 2026-06-09 2026-06-12 | 2026-06-15 2026-06-20 | 2026-06-28 (3 rows) -- 7 réservations chevauchantes réduites à 3 plages
SQLIntervallesChevauchementWindow Functions