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

ASUM(amount) OVER (PARTITION BY user_id ROWS UNBOUNDED PRECEDING)
BSUM(amount) OVER (PARTITION BY user_id) без ORDER BY
CSUM(amount) OVER (ORDER BY paid_at) без PARTITION BY
DSUM(amount) OVER (PARTITION BY user_id ORDER BY paid_at)
Правильный ответ. Накопительный итог требует ORDER BY в окне, а раздельность по пользователям — PARTITION BY.

Разбор

SUM(amount) OVER (PARTITION BY user_id ORDER BY paid_at) суммирует значения внутри каждого пользователя в порядке времени платежа и возвращает кумулятивный итог в каждой строке. Без ORDER BY получится общий итог по пользователю, повторённый в каждой строке. Без PARTITION BY накопление пойдёт по всем пользователям вместе, что ломает пользовательскую аналитику. Вариант с GROUP BY вообще схлопывает строки и делает накопление невозможным.

Проверь себя · 1/3разбор после ответа
В одной категории 4 товара с выручкой 100, 100, 90 и 80. Вычисляем RANK() OVER (ORDER BY revenue DESC). Какие ранги получат строки при сортировке по убыванию выручки?
Тренировать SQL в Telegram

Ещё вопросы по теме «Оконные функции»