Поздние события в SQL: почему вчерашний отчёт меняется сегодня
Продажи за вчера выросли после ночного пересчёта, хотя новых покупок вчера уже быть не могло. Событие могло произойти вчера, а попасть в хранилище сегодня. Для инкрементальной загрузки и бизнес-отчёта нужны разные временные поля.
Как разобрать ситуацию
event_time определяет период метрики, loaded_at — момент появления записи в нашей системе. Если читать только новые event_time, запоздавшая операция потеряется. В примере новые поступления отбираются по loaded_at, но затем относятся к дням события. Для регулярного процесса нужны сохранённая контрольная точка, защита от дублей и правило повторного пересчёта затронутых периодов.
Пример и ожидаемый результат
Платёж 1 совершён 1 октября, но загружен 3 октября. Платёж 2 совершён и загружен 3 октября. При обработке поступлений за 3 октября обе записи должны попасть в расчёт, но в разные бизнес-дни.
WITH e(id,event_d,loaded_d,amount) AS(VALUES(1,'2026-10-01','2026-10-03',100),(2,'2026-10-03','2026-10-03',70))
SELECT event_d,SUM(amount)
FROM e
WHERE loaded_d>='2026-10-03' AND loaded_d<'2026-10-04'
GROUP BY event_d
ORDER BY event_d;Получаем две даты события: 1 октября с суммой 100 и 3 октября с суммой 70. День загрузки не подменяет дату продажи.
Проверка перед применением
- Добавьте задержку на несколько дней и убедитесь, что событие не потерялось.
- Повторно запустите одно и то же окно загрузки: итог не должен удвоиться.
- На границе loaded_at используйте стабильный ключ или перекрытие с дедупликацией, если несколько записей имеют одинаковое время.
Пользователю дашборда полезно знать, когда период считается закрытым. Пока источник допускает запоздавшие записи, небольшие пересчёты закономерны. Не объявляйте их багом метрики до сверки двух временных шкал и не скрывайте изменение данных молчаливой заменой даты события датой загрузки.
Границы решения
Показан только отбор и группировка. Полноценная инкрементальная запись требует транзакционного обновления контрольной точки и целевой таблицы; один SELECT этого не обеспечивает.
Если запросы уже пишутся, а уверенности в кардинальности, оконных рамках и проверке результата не хватает, продолжить практику можно в нашем платном курсе
Продвинутый SQL: сложные запросы и задачи для собеседований. Перед записью сравните программу со своей задачей и подготовкой.
Техническая справка: www.sqlite.org: документация.
Следующий шаг: Сложные SQL-запросы: разборы расчётов и ошибок. По смежным вопросам: Как разбить события на сессии в SQL по паузе между действиями, Воронка в SQL: почему наличие трёх событий ещё не означает прохождение.
