SQLОконные функцииMediumБесплатно

Накопительная выручка по дням

// Условие

Посчитайте ежедневную выручку (сумма amount завершённых заказов) и накопительную выручку с начала данных. Выведите order_day (DATE), daily_revenue и running_total. Отсортируйте по order_day. Первые 30 дней.

// Таблицы

sandbox.orders
order_idINT
user_idINT
order_dateTIMESTAMP
amountNUMERIC(10,2)
statusVARCHAR(20)
delivery_daysINT
promo_codeVARCHAR(20)

// Что тренирует

SUM OVERRunning totalDATE cast
▶ Решить в SQL-песочнице

// Решение

Подсказка

Сначала агрегируйте по дню (DATE(order_date)), потом SUM(...) OVER (ORDER BY order_day) для running total.

Сначала попробуй сам → Показать решение
WITH daily AS (
  SELECT
    order_date::date AS order_day,
    SUM(amount) AS daily_revenue
  FROM sandbox.orders
  WHERE status = 'completed'
  GROUP BY order_date::date
)
SELECT
  order_day,
  ROUND(daily_revenue, 2) AS daily_revenue,
  ROUND(SUM(daily_revenue) OVER (ORDER BY order_day), 2) AS running_total
FROM daily
ORDER BY order_day
LIMIT 30;

SUM() OVER (ORDER BY ...) без PARTITION BY — это running total (накопительная сумма). По умолчанию фрейм = RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW — т.е. суммирует от первой строки до текущей. Паттерн running total используется для кумулятивных графиков в BI и для расчёта LTV по когортам.

// Похожие задачи

// Разобраться в теме

→ Оконные функции SQL