Для каждого дня нужно вывести пользователей, попавших в топ-3 мест по выручке за день. Правило мест такое: при тайах места пропускаются (например, 1, 1, 3, 4...). Какое условие на оконную функцию корректно для отбора?
AОставить строки, где
ROW_NUMBER() OVER (PARTITION BY dt ORDER BY revenue DESC) <= 3BОставить строки, где
DENSE_RANK() OVER (PARTITION BY dt ORDER BY revenue DESC) <= 3CОставить строки, где
SUM(revenue) OVER (PARTITION BY dt ORDER BY revenue DESC) <= 3DОставить строки, где
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). Какие ранги будут у строк, если упорядочить товары по убыванию выручки?Ещё вопросы по теме «Оконные функции»
- В одной категории 4 товара с выручкой 100, 100, 90 и 80. Вычисляем `RANK() OVER (ORDER BY revenue DESC)`. Какие ранги будут у строк, если упорядочить товары по убыванию выручки?
- Вы ищете последнюю транзакцию пользователя, используя `ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY paid_at DESC)` и оставляя `row_number = 1`. Что верно, если у пользователя две транзакции с одинаковым `paid_at`?
- Вы делаете рейтинг товаров по выручке внутри категории. Если два товара делят 2 место, следующий товар должен получить 3 место (без пропуска). Какая функция подходит лучше всего?
- В каждой категории нужно выбрать товары с тремя наибольшими различными значениями `revenue`, включая все товары, которые делят эти значения (при равных значениях). Какой вариант даст нужный результат?
- Нужно пронумеровать заказы каждого пользователя по времени покупки, начиная с 1, чтобы потом найти 1-й, 2-й, 3-й заказ. Какое выражение подходит?
- Все вопросы по «Оконные функции» →