Вступить в клуб →
сложнаявопросSQL и оптимизация запросов

Нарастающий итог склеился на строках с одинаковой датой

В таблице dm.daily_sales на одну дату приходится несколько строк (по одной на филиал). Инженер написал нарастающий итог:

SELECT event_date,
       branch_id,
       amount,
       sum(amount) OVER (ORDER BY event_date) AS running_total
FROM dm.daily_sales;

Аналитик жалуется: у всех филиалов внутри одной даты running_total одинаковый и уже включает выручку всех филиалов этого дня. Что происходит и как получить построчный нарастающий итог?

  • Нужно добавить в окно PARTITION BY event_date: сейчас вся история лежит в одной партиции, из-за чего строки одной даты получают общий итог; с партицией по дате накопление пойдёт построчно и дальше по всей истории.
  • Рамка окна по умолчанию — RANGE, и в неё попадают все строки с тем же значением ORDER BY; чтобы итог рос построчно, нужна рамка ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW (и однозначный порядок сортировки).
  • Строки одной даты приходят в оконную функцию одной пачкой, и агрегат вычисляется один раз на пачку; чтобы получить построчный итог, промежуточный результат материализуют во временной таблице с явной нумерацией строк.
  • Причина в типе колонки: event_date хранит только дату, поэтому строки одного дня для окна неразличимы. После приведения ключа сортировки к timestamp порядок станет строгим и итог начнёт расти построчно.

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела