SQL

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

Snippets liés

Retour au Data Lab