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

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 вообще схлопывает строки и делает накопление невозможным.

Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Продолжить в браузере

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