Нужно выбрать ровно один «самый дорогой» заказ каждого пользователя. Если у пользователя несколько заказов с одинаковой суммой, нужно взять самый поздний по времени. Какое окно решает задачу?

AROW_NUMBER() OVER (PARTITION BY user_id ORDER BY amount DESC)
BROW_NUMBER() OVER (PARTITION BY user_id ORDER BY amount DESC, order_at DESC)
CRANK() OVER (PARTITION BY user_id ORDER BY amount DESC, order_at DESC)
DDENSE_RANK() OVER (PARTITION BY user_id ORDER BY amount DESC, order_at DESC)
Правильный ответ. Чтобы детерминированно разрешить равенство значений, добавьте второй ключ в ORDER BY окна.

Разбор

ROW_NUMBER() присваивает уникальные номера и позволяет потом отфильтровать ровно одну строку с номером 1 на каждого пользователя. Чтобы при равной сумме всегда выбирать самый поздний заказ, в порядок добавляют второй ключ: сначала сумма по убыванию, затем дата заказа по убыванию. RANK() и DENSE_RANK() могут дать одинаковый ранг нескольким строкам и оставят их все, поэтому одной строкой результат не ограничится. Если в ORDER BY оставить только сумму, при равных суммах СУБД выберет строку недетерминированно.

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

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