В каждой категории нужно выбрать товары с тремя наибольшими различными значениями выручки (revenue), включая все товары, которые делят эти значения при равенстве. Какой вариант даст нужный результат?
AПосчитать
DENSE_RANK() OVER (PARTITION BY category_id ORDER BY revenue DESC) и оставить строки, где dense_rank <= 3BПосчитать
RANK() OVER (PARTITION BY category_id ORDER BY revenue DESC) и оставить строки, где rank <= 3CСделать
GROUP BY category_id и взять три категории с наибольшей суммарной выручкой через LIMIT 3DПосчитать
ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY revenue DESC) и оставить строки, где row_number <= 3Правильный ответ. Для выбора первых N различных значений с учётом равных значений удобнее
DENSE_RANK.Разбор
Если нужно взять именно три различных уровня выручки внутри категории и включить все равные значения, подходит DENSE_RANK() OVER (PARTITION BY category_id ORDER BY revenue DESC): одинаковые значения делят один ранг, а ранги идут без пропусков. Условие dense_rank <= 3 захватит ровно три уровня значений. ROW_NUMBER ограничит до трёх строк и может «отрезать» часть строк с равной выручкой. RANK пропустит ранг 3 при равных значениях сверху, и тогда третий уровень по значению не попадёт в выборку. GROUP BY + LIMIT 3 агрегирует категории, а не товары внутри.
Проверь себя · 1/3разбор после ответа
В таблице метрик есть
dt, platform, dau. Нужно вывести значение dau за предыдущий день для той же платформы, чтобы посчитать дневное изменение. Какое выражение верное?Ещё вопросы по теме «Оконные функции»
- В одной категории 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 место (без пропуска). Какая функция подходит лучше всего?
- Нужно пронумеровать заказы каждого пользователя по времени покупки, начиная с 1, чтобы найти его 1-й, 2-й, 3-й заказ. Какое выражение подходит?
- В таблице платежей для каждой транзакции нужен накопительный итог сумм пользователя на этот момент. Какое выражение даёт корректный результат?
- Все вопросы по «Оконные функции» →