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

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 оставить только сумму, при равных суммах СУБД выберет строку недетерминированно.

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

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

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

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

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