Нарастающий итог склеился на строках с одинаковой датой
В таблице 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 порядок станет строгим и итог начнёт расти построчно.
