Вы хотите получить по одному ряду на пользователя (итоговая выручка), и вместо GROUP BY используете SUM(amount) OVER (PARTITION BY user_id). Почему это не дает одну строку на пользователя?

AПотому что оконные функции нельзя использовать с SUM
BПотому что PARTITION BY сортирует строки, а GROUP BY — нет
CПотому что GROUP BY обязательно должен идти вместе с ORDER BY
DПотому что оконная агрегация сохраняет исходные строки и только добавляет вычисленную колонку, а GROUP BY агрегирует строки до одной на группу
Правильный ответ. Оконные функции не меняют гранулярность результата, в отличие от GROUP BY.

Разбор

SUM(amount) OVER (PARTITION BY user_id) вычисляет итог по пользователю, но возвращает этот итог в каждой исходной строке пользователя. Это удобно для долей и сравнения строки с итогом. GROUP BY user_id схлопывает строки и действительно дает одну строку на пользователя. Поэтому оконная агрегация не является заменой GROUP BY, если цель — уменьшить количество строк в результате.

Проверь себя · 1/3разбор после ответа
В таблице платежей нужно вывести для каждой транзакции накопительную сумму платежей пользователя на этот момент (running total). Какое выражение даст накопительный итог по пользователю?
Тренировать SQL в Telegram

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