Накопительная выручка по дням
// Условие
Посчитайте ежедневную выручку (сумма amount завершённых заказов) и накопительную выручку с начала данных. Выведите order_day (DATE), daily_revenue и running_total. Отсортируйте по order_day. Первые 30 дней.
// Таблицы
sandbox.orders
order_id | INT |
user_id | INT |
order_date | TIMESTAMP |
amount | NUMERIC(10,2) |
status | VARCHAR(20) |
delivery_days | INT |
promo_code | VARCHAR(20) |
// Что тренирует
SUM OVERRunning totalDATE cast
// Решение
Подсказка
Сначала агрегируйте по дню (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 по когортам.