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_start | period_end |
|---|---|
| 2025-02-01 | 2025-12-31 |
| 2026-02-01 | 2026-03-01 |
Pratiquer :Fusionner les périodes qui se chevauchent