SQL Dojo Beta
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_startperiod_end
2025-02-012025-12-31
2026-02-012026-03-01
Provalo in Randori