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

AОконная агрегация подставляет итог в каждую строку секции и не меняет гранулярность, в отличие от GROUP BY
BPARTITION BY сортирует строки и поэтому результат не схлопывается до одной строки на пользователя
CКонструкция SUM(amount) OVER (...) не поддерживается в большинстве СУБД и работает только с явным GROUP BY
DОконная функция считает только последний платёж пользователя, а остальные строки сохраняет как есть
Правильный ответ. Оконные функции не меняют гранулярность результата, в отличие от GROUP BY.

Разбор

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

Проверь себя · 1/3разбор после ответа
Для каждой покупки пользователя нужно добавить дату следующей покупки этого же пользователя, чтобы потом посчитать интервал между покупками. Что использовать?
Тренировать SQL в Telegram

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