SQL: Объединение перекрывающихся интервалов — Объединённая занятость внутри отчётного окна

Практическая задача по SQL на тему «Объединение перекрывающихся интервалов». В условии приведены схема таблиц, ограничения данных, имена столбцов результата и порядок сортировки. Напишите один SELECT или WITH-запрос для SQLite. Перед проверкой продумайте пустой результат, повторяющиеся строки и границы диапазонов, если они встречаются в условии. Проверяется результат запроса, поэтому допустима эквивалентная реализация. Сначала решите задачу самостоятельно; продолжение практики доступно в полном курсе продвинутого SQL.

Объединённая занятость внутри отчётного окна

Что уже дано

Таблица room_bookings(booking_id INTEGER PRIMARY KEY, room_id INTEGER NOT NULL, start_time TEXT NOT NULL, end_time TEXT NOT NULL). До 500 броней; ID положительные, время UTC YYYY-MM-DD HH:MM:SS в 2024 году. Каждый интервал полуоткрытый [start_time,end_time), start_time < end_time. Вложенные, совпадающие и перекрывающиеся брони допустимы.

Что нужно сделать

Покажите объединённые периоды занятости комнат только внутри отчётного окна [2024-06-01 10:00:00,2024-06-01 16:00:00). Части вне окна не входят в результат, брони без положительного пересечения с окном не учитываются. Перекрывающиеся и соприкасающиеся части объединяются. bookings_count — число исходных броней, внёсших положительный отрезок в соответствующий период; разные ID считаются отдельно.

Ввод и вывод

Отправьте один SELECT или WITH-запрос; stdin и печать не используются. Ровно 4 столбцов в указанном порядке и с этими именами: room_id, merged_start, merged_end, bookings_count. room_id и bookings_count — INTEGER; границы — TEXT; NULL нет. Сортировка: room_id ASC, merged_start ASC. Если занятости внутри отчётного окна нет, результат пустой. В тестовых результатах разделитель |, NULL — пустое поле. Допускается любой эквивалентный запрос.

Пример

Подготовка данных
INSERT INTO room_bookings VALUES (1,1,'2024-06-01 09:00:00','2024-06-01 12:00:00'),(2,1,'2024-06-01 10:30:00','2024-06-01 11:00:00'),(3,1,'2024-06-01 11:30:00','2024-06-01 13:00:00'),(4,1,'2024-06-01 13:00:00','2024-06-01 14:00:00'),(5,1,'2024-06-01 15:00:00','2024-06-01 17:00:00');
Вывод
1|2024-06-01 10:00:00|2024-06-01 14:00:00|4
1|2024-06-01 15:00:00|2024-06-01 16:00:00|1
РешениеSQL · SQLite

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи