ادغام بازههای تاریخیِ همپوشان
دورههای همپوشان رو به بازههای پیوسته تبدیل میکنی: هر وقت شروع یه دوره از بیشینهٔ پایانهای قبلی جلوتر بزنه یه گروه جدید شناسایی میشه، بعد بر اساس گروه تجمیع میکنی.
کاربرد
یکی کردن دورههای قرارداد، مرخصی یا رزروی که با هم تداخل دارن.
پیشنیازها
PostgreSQL, SQL Server 2012+
SQL
WITH ordered AS (
SELECT *,
MAX(end_date) OVER (
ORDER BY start_date
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
) AS prev_max_end
FROM reservations
), flagged AS (
SELECT *,
CASE WHEN prev_max_end IS NULL
OR start_date > prev_max_end
THEN 1 ELSE 0 END AS new_group
FROM ordered
), grouped AS (
SELECT *, SUM(new_group) OVER (ORDER BY start_date) AS grp
FROM flagged
)
SELECT MIN(start_date) AS merged_start, MAX(end_date) AS merged_end
FROM grouped
GROUP BY grp
ORDER BY merged_start;نتیجه
merged_start | merged_end --------------+------------ 2026-06-01 | 2026-06-09 2026-06-12 | 2026-06-15 2026-06-20 | 2026-06-28 (3 rows) -- 7 réservations chevauchantes réduites à 3 plages
SQLIntervallesChevauchementWindow Functions