Справочник по функциям

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;
member_namestatusstatus_rankstatus_dense_rank
Wednesday Addamsdaughter11
Lela Quinceydaughter11
Annie Quinceydaughter11
Headley Quinceyfather42
Ernest Forrestfather42
Constance Forrestmother63
Flavia Quinceymother63
Andie Quinceyson84

Три самые высокие цены

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;
goodunit_priceprice_rank
14660001
11100002
1655003

Подробности

Функция удобна, чтобы выбрать N наибольших значений вместе с повторами: одинаковые значения получают одно место, а следующие места не пропускаются. Отбирать по рангу нужно во внешнем запросе — в WHERE оконные функции не работают.

Смотрите также

Где изучить