Tecnica
Unire periodi sovrapposti
Unisci i periodi che si sovrappongono o si toccano in periodi continui, con un massimo progressivo delle date di fine.
Ordina i periodi per inizio. Un periodo apre un nuovo blocco quando inizia dopo la fine più recente vista finora:
MAX(end) OVER (… ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING). Una SUM progressiva di questi flag numera i
blocchi, poi MIN(start) e MAX(end) per blocco. Confrontare solo con il periodo precedente (LAG) fallisce quando un
periodo lungo ne contiene di più corti.
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 |
Esercitati:Merge the overlapping periods