SELECT * FROM (
SELECT product, price,
DENSE_RANK() OVER (ORDER BY price DESC) AS dr
FROM products
) t
WHERE dr <= 3;
Результат:
product | price | dr A | 990 | 1 B | 990 | 1 C | 750 | 2 D | 500 | 3
SELECT dept, name, salary,
DENSE_RANK() OVER (PARTITION BY dept ORDER BY salary DESC) AS dr
FROM employees;
Результат:
dept | name | salary | dr IT | Аня | 200 | 1 IT | Boris| 200 | 1 IT | Вера | 150 | 2Порешать SQL-задачи в тренажёре →
Вопрос «топ-N уникальных значений» почти всегда про DENSE_RANK. На собеседовании покажи, что понимаешь разницу между «топ-3 строки» (ROW_NUMBER), «топ-3 позиции с ничьими» (RANK) и «топ-3 уникальных уровня» (DENSE_RANK).
Оба дают одинаковый ранг при равных значениях, но RANK пропускает следующие номера на число ничьих, а DENSE_RANK идёт подряд без пропусков.
Именно DENSE_RANK: он присваивает уникальным значениям плотные уровни 1, 2, 3, поэтому dr <= N вернёт ровно N уникальных значений (со всеми их строками).
Да, оконные функции, включая DENSE_RANK, поддерживаются в SQLite с версии 3.25 и в PostgreSQL. В тренажёре обе доступны.
Оконные функции · Ранжирование
ROW_NUMBER · RANK · LAG · LEAD · NTILE · SUM OVER
Открыть SQL-тренажёр (565 задач) →