В каждой категории нужно выбрать товары с тремя наибольшими различными значениями revenue, включая все товары, которые делят эти значения (при равных значениях). Какой вариант даст нужный результат?

AПосчитать RANK() OVER (PARTITION BY category_id ORDER BY revenue DESC) и оставить строки, где rank <= 3
BПосчитать ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY revenue DESC) и оставить строки, где row_number <= 3
CСделать GROUP BY category_id и взять TOP 3 категории по суммарной revenue
DПосчитать DENSE_RANK() OVER (PARTITION BY category_id ORDER BY revenue DESC) и оставить строки, где dense_rank <= 3
Правильный ответ. Для выбора top-N различных значений с учетом равных значений удобнее DENSE_RANK.

Разбор

Если нужно взять именно три различных уровня revenue внутри категории и включить все равные значения, то подходит DENSE_RANK() OVER (PARTITION BY category_id ORDER BY revenue DESC): одинаковые значения делят один ранг, а ранги идут без пропусков. Условие dense_rank <= 3 захватит ровно три уровня значений. ROW_NUMBER ограничивает количество строк и может «отрезать» часть строк с равной revenue. RANK может пропустить ранг 3 при равных значениях сверху, и тогда третий уровень по значению не попадет в выборку.

Проверь себя · 1/3разбор после ответа
В таблице платежей нужно вывести для каждой транзакции накопительную сумму платежей пользователя на этот момент (running total). Какое выражение даст накопительный итог по пользователю?
Тренировать SQL в Telegram

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