Нарастающий итог выручки по дням плюс кумулятивная доля дня в году
Таблица daily_revenue(day, revenue) содержит по одной строке на день за один год. Для каждого дня верните его выручку, нарастающий итог до этого дня включительно и этот итог как процент от выручки за весь год.
-- по дню: выручка, нарастающий итог и кумулятивная доля от итога за год
Напишите запрос.
Нарастающий SUM(revenue) OVER (ORDER BY day) даёт бегущий итог — рамка идёт от начала до текущей строки. Делят его на итог за год из SUM(revenue) OVER (), чья рамка — все строки.
- ✗Путать, какое окно (упорядоченное или нет) копит день за днём
- ✗Считать, что рамка окна не умеет давать бегущий итог
- ✗Добавлять
PARTITION BY day, что изолирует день и ломает накопление
- →Какова рамка по умолчанию у
SUM(...) OVER (ORDER BY day)? - →Как сбрасывать бегущий итог в начале каждого месяца?
Бегущий итог — это упорядоченная оконная сумма; её рамка по умолчанию RANGE UNBOUNDED PRECEDING AND CURRENT ROW копит от начала до текущей строки. Итог за год — это неупорядоченное окно OVER (), охватывающее все строки:
SELECT day,
revenue,
SUM(revenue) OVER (ORDER BY day) AS running_total,
ROUND(100.0 * SUM(revenue) OVER (ORDER BY day)
/ SUM(revenue) OVER (), 2) AS cumulative_pct
FROM daily_revenue
ORDER BY day;
Ключевой момент — контраст: ORDER BY day даёт нарастающую рамку, а пустое OVER () — полный итог по партиции. PARTITION BY day был бы ошибкой: он изолировал бы каждый день, и бегущий итог свёлся бы к выручке одного дня.