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_start | period_end |
|---|---|
| 2025-02-01 | 2025-12-31 |
| 2026-02-01 | 2026-03-01 |