Перейти к содержанию
SQLMiddle≈ 25 минутУчебная задача HireHero

Накопленная выручка без ошибок в окне

Финансовая команда строит график выручки по дням. В исходной таблице несколько операций могут приходиться на одну дату.

Условие

Сначала посчитай дневную выручку, затем накопленную выручку с начала доступного периода. В ответе должна быть ровно одна строка на дату, отсортированная по возрастанию. Все операции оплачены, возвратов нет. Дни без операций выводить не нужно.

Данные

transaction_iddayamount
12026-09-0160
22026-09-0140
32026-09-02180
42026-09-0390
52026-09-0350

Все данные учебные. Код можно выполнить в своей среде; поле ниже предназначено для черновика, без запуска кода.

Черновик сохраняется в этом браузере. Ничего не отправляется на сервер.

Если нужен следующий шаг

Подсказка 1
Сгруппируй операции по дню до применения оконной функции.
Подсказка 2
Для накопления задай окно от UNBOUNDED PRECEDING до CURRENT ROW.

Проверь себя

Показать решение и объяснение
1 сентября: 100 за день, 100 накопительно. 2 сентября: 180 и 280. 3 сентября: 140 и 420.
SQL · SQLite / PostgreSQL
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.
  • Сортировка в выдаче задана явно.

Вопрос на продолжение

Как добавить дни без продаж? Как обнулять накопительный итог в начале каждого месяца?