DENSE_RANK
Возвращает ранг строки в разделе окна, как RANK, но без пропусков в нумерации мест.
PostgreSQL 17.5
DENSE_RANK() OVER ([PARTITION BY ...] [ORDER BY ...])Параметры
- PARTITION BYнеобязательный
- Столбцы, по которым строки делятся на разделы, ранги считаются в каждом отдельно
- ORDER BYнеобязательный
- Порядок строк, по которому определяется место
Возвращаемое значение
Целое число (bigint) — место строки; одинаковые значения делят место, следующее место больше на единицу: 1, 2, 2, 3
Примеры
DENSE_RANK и RANK по статусу
PostgreSQL 17.5
SELECT member_name,
status,
RANK() OVER (
ORDER BY status
) AS status_rank,
DENSE_RANK() OVER (
ORDER BY status
) AS status_dense_rank
FROM FamilyMembers;Три самые высокие цены
PostgreSQL 17.5
SELECT good,
unit_price,
price_rank
FROM (
SELECT good,
unit_price,
DENSE_RANK() OVER (
ORDER BY unit_price DESC
) AS price_rank
FROM Payments
) AS ranked
WHERE price_rank <= 3;Подробности
Функция удобна, чтобы выбрать N наибольших значений вместе с повторами: одинаковые значения получают одно место, а следующие места не пропускаются. Отбирать по рангу нужно во внешнем запросе — в WHERE оконные функции не работают.