Накопленная выручка без ошибок в окне
Финансовая команда строит график выручки по дням. В исходной таблице несколько операций могут приходиться на одну дату.
Условие
Сначала посчитай дневную выручку, затем накопленную выручку с начала доступного периода. В ответе должна быть ровно одна строка на дату, отсортированная по возрастанию. Все операции оплачены, возвратов нет. Дни без операций выводить не нужно.
Данные
| transaction_id | day | amount |
|---|---|---|
| 1 | 2026-09-01 | 60 |
| 2 | 2026-09-01 | 40 |
| 3 | 2026-09-02 | 180 |
| 4 | 2026-09-03 | 90 |
| 5 | 2026-09-03 | 50 |
Все данные учебные. Код можно выполнить в своей среде; поле ниже предназначено для черновика, без запуска кода.
Если нужен следующий шаг
Подсказка 1
Подсказка 2
Проверь себя
Показать решение и объяснение
WITH daily AS (
SELECT day, SUM(amount) AS revenue
FROM transactions
GROUP BY day
)
SELECT day, revenue,
SUM(revenue) OVER (
ORDER BY day
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS cumulative_revenue
FROM daily
ORDER BY day;Агрегация приводит данные к нужному уровню детализации: одному дню. Оконная функция сохраняет строки и добавляет накопительную сумму. ORDER BY внутри OVER определяет порядок расчёта, а внешний ORDER BY — порядок выдачи. Явно заданная рамка делает намерение понятным следующему читателю запроса.
Проверка решения
- В результате три строки, хотя в источнике пять операций.
- Последний накопительный итог равен сумме всех операций: 420.
- Сортировка в выдаче задана явно.
Вопрос на продолжение
Как добавить дни без продаж? Как обнулять накопительный итог в начале каждого месяца?