SQL Dojo Beta
Técnica

Fusionar periodos solapados

Fusionar los periodos que se solapan o se tocan en periodos continuos, con un máximo acumulado de las fechas de fin.

Ordene los periodos por inicio. Un periodo abre un nuevo bloque cuando empieza después del fin más tardío visto hasta ahora: MAX(end) OVER (… ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING). Una SUM acumulada de esos indicadores numera los bloques, y luego MIN(start) y MAX(end) por bloque. Comparar solo con el periodo anterior (LAG) falla cuando un periodo largo contiene otros más cortos.

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
Probarlo en Randori