Для каждого дня нужно вывести пользователей, попавших в топ-3 мест по выручке за день. Правило мест такое: при тайах места пропускаются (например, 1, 1, 3, 4...). Какое условие на оконную функцию корректно для отбора?

AОставить строки, где ROW_NUMBER() OVER (PARTITION BY dt ORDER BY revenue DESC) <= 3
BОставить строки, где DENSE_RANK() OVER (PARTITION BY dt ORDER BY revenue DESC) <= 3
CОставить строки, где SUM(revenue) OVER (PARTITION BY dt ORDER BY revenue DESC) <= 3
DОставить строки, где RANK() OVER (PARTITION BY dt ORDER BY revenue DESC) <= 3
Правильный ответ. Для «мест с пропусками» используйте RANK и фильтр по рангу.

Разбор

RANK() реализует «соревновательное» ранжирование: одинаковые значения делят место, а следующее место сдвигается (1, 1, 3...). Поэтому для отбора топ-3 мест логично посчитать RANK() OVER (PARTITION BY dt ORDER BY revenue DESC) и оставить строки с rank <= 3. ROW_NUMBER() может отрезать часть тайа, а DENSE_RANK() считает места без пропусков (1, 1, 2...), что не соответствует заданному правилу.

Проверь себя · 1/3разбор после ответа
В одной категории 4 товара с выручкой 100, 100, 90 и 80. Вычисляем RANK() OVER (ORDER BY revenue DESC). Какие ранги будут у строк, если упорядочить товары по убыванию выручки?
Тренировать SQL в Telegram

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