SQL Dojo Beta
Muster

Überlappende Zeiträume zusammenführen

Zeiträume, die sich überlappen oder berühren, mit einem laufenden Maximum der Enddaten zu durchgehenden zusammenführen.

Sortieren Sie die Zeiträume nach Beginn. Ein Zeitraum eröffnet einen neuen Block, wenn er nach dem spätesten bisher gesehenen Ende beginnt: MAX(end) OVER (… ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING). Eine laufende SUM dieser Markierungen nummeriert die Blöcke, dann MIN(start) und MAX(end) pro Block. Der Vergleich nur mit dem vorherigen Zeitraum (LAG) scheitert, wenn ein langer Zeitraum kürzere enthält.

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
In Randori ausprobieren