SELECT category, product, revenue,
RANK() OVER (PARTITION BY category ORDER BY revenue DESC) AS rnk
FROM sales;
Результат:
category | product | revenue | rnk A | X | 500 | 1 A | Y | 500 | 1 A | Z | 300 | 3
SELECT * FROM (
SELECT product, revenue,
RANK() OVER (ORDER BY revenue DESC) AS rnk
FROM sales
) t
WHERE rnk <= 3;
Результат:
product | revenue | rnk X | 500 | 1 Y | 500 | 1 Z | 300 | 3Порешать SQL-задачи в тренажёре →
Классический вопрос: «в чём разница RANK, DENSE_RANK и ROW_NUMBER». Разбери на примере с ничьими и объясни, какой выбрать для «топ-N по каждой группе» в зависимости от того, что делать с одинаковыми значениями.
Ранг отражает позицию в общем порядке: если два значения делят 1-е место, следующее логически на 3-й позиции, поэтому 2-й номер пропускается. Это поведение «спортивного» ранжирования.
RANK — когда важна абсолютная позиция с учётом ничьих (как в спорте). DENSE_RANK — когда нужны плотные уровни без дыр (например, «топ-3 уникальных цены»).
Да, тогда ранжирование идёт по всей выборке как по одному окну. PARTITION BY нужен, только если ранги считаются отдельно внутри каждой группы.
Оконные функции · Ранжирование
ROW_NUMBER · DENSE_RANK · LAG · LEAD · NTILE · SUM OVER
Открыть SQL-тренажёр (565 задач) →