Загрузка гостиницы в SQL: считать ночи, а не количество бронирований
Пять броней не означают пять занятых номеров сегодня. Бронирования различаются длительностью, а дата выезда обычно уже не является ночью проживания. Для загрузки за период нужна единица «номер-ночь» и явно заданная доступная ёмкость.
Как разобрать ситуацию
В учебной модели каждая бронь занимает один номер. Пересекаем интервал проживания с анализируемым периодом и суммируем число ночей. Затем делим на количество доступных номеров, умноженное на длину периода. Если номер закрыт на ремонт, доступная ёмкость должна уменьшиться по конкретным датам, а не постоянно за весь месяц.
Пример и ожидаемый результат
У гостиницы два номера. За 1–4 октября доступно шесть номеро-ночей. Первая бронь длится 1–3 октября и занимает две ночи, вторая — 2–4 октября и тоже занимает две. Загрузка равна 4/6, то есть приблизительно 66.7%.
WITH bookings(start_d,end_d) AS(VALUES('2026-10-01','2026-10-03'),('2026-10-02','2026-10-04')), nights AS(
SELECT SUM(MAX(0,julianday(MIN(end_d,'2026-10-04'))-julianday(MAX(start_d,'2026-10-01')))) n
FROM bookings)
SELECT CAST(n AS INT),ROUND(100.0*n/(2*3),1)
FROM nights;Запрос возвращает четыре занятые номеро-ночи и 66.7% загрузки. Две брони сами по себе не дают ни знаменатель, ни корректную загрузку.
Проверка перед применением
- Проверьте бронь с выездом ровно в начало периода: занятых ночей внутри периода нет.
- Добавьте отмену и определите, занимает ли она фактический номер.
- Сверьте сумму с подневной занятостью: средняя не должна скрывать двойную продажу номера.
Если бизнес сравнивает недели, разделяйте изменение спроса и изменение доступной ёмкости. Закрытие половины номеров способно повысить процент загрузки без дополнительного проданного проживания. Поэтому рядом полезно хранить занятые ночи и доступные ночи отдельными абсолютными числами, а не только итоговую долю.
Границы решения
Пример не различает категории номеров, ранний заезд и размещение нескольких гостей. Двойное бронирование способно дать физически невозможный результат; такой случай нужно расследовать, а не ограничивать процент сверху до ста.
Если запросы уже пишутся, а уверенности в кардинальности, оконных рамках и проверке результата не хватает, продолжить практику можно в нашем платном курсе
Продвинутый SQL: сложные запросы и задачи для собеседований. Перед записью сравните программу со своей задачей и подготовкой.
Техническая справка: www.sqlite.org: документация, www.sqlite.org: документация.
Следующий шаг: Сложные SQL-запросы: разборы расчётов и ошибок. По смежным вопросам: Воронка в SQL: почему наличие трёх событий ещё не означает прохождение, Составной индекс SQL: как проверить пользу, а не угадать порядок полей.
