SQL Dojo Bêta
Technique

Fusionner des périodes qui se chevauchent

Fusionner les périodes qui se chevauchent ou se touchent en périodes continues, avec un maximum cumulé des dates de fin.

Triez les périodes par début. Une période ouvre un nouveau bloc quand elle commence après la fin la plus tardive vue jusque-là : MAX(fin) OVER (… ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING). Une SUM cumulée de ces indicateurs numérote les blocs, puis MIN(début) et MAX(fin) par bloc. Comparer à la seule période précédente (LAG) échoue quand une longue période en contient de plus courtes.

WITH memberships(started_on, ended_on) AS (VALUES
  (DATE '2025-02-01', DATE '2025-12-31'),
  (DATE '2025-03-15', DATE '2025-04-15'),
  (DATE '2025-05-01', DATE '2025-06-01'),
  (DATE '2026-02-01', DATE '2026-03-01')),
flagged AS (
  SELECT started_on, ended_on,
         CASE WHEN started_on <= MAX(ended_on) OVER (ORDER BY started_on
                ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) THEN 0 ELSE 1 END AS starts_new
  FROM memberships
),
numbered AS (SELECT *, SUM(starts_new) OVER (ORDER BY started_on) AS period FROM flagged)
SELECT MIN(started_on) AS period_start, MAX(ended_on) AS period_end
FROM numbered
GROUP BY period
ORDER BY period_start;
period_startperiod_end
2025-02-012025-12-31
2026-02-012026-03-01
L’essayer en Randori