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

RANK

Возвращает ранг строки в разделе окна — её место по порядку ORDER BY.

MySQL 8.1
RANK() OVER ([PARTITION BY ...] [ORDER BY ...])

Параметры

PARTITION BYнеобязательный
Столбцы, по которым строки делятся на разделы, ранги считаются в каждом отдельно
ORDER BYнеобязательный
Порядок строк, по которому определяется место; без него у всех строк ранг 1

Возвращаемое значение

Целое число (BIGINT UNSIGNED) — место строки; одинаковые значения делят место, следующие места пропускаются: 1, 2, 2, 4

Примеры

Ранг по статусу с пропусками

MySQL 8.1
SELECT member_name,
	status,
	RANK() OVER (
		ORDER BY status
	) AS status_rank
FROM FamilyMembers;
member_namestatusstatus_rank
Lela Quinceydaughter1
Annie Quinceydaughter1
Wednesday Addamsdaughter1
Headley Quinceyfather4
Ernest Forrestfather4
Flavia Quinceymother6
Constance Forrestmother6
Andie Quinceyson8

Места по зарплате в отделах

MySQL 8.1
SELECT department_id,
	name,
	salary,
	RANK() OVER (
		PARTITION BY department_id
		ORDER BY salary DESC
	) AS salary_rank
FROM employees;
department_idnamesalarysalary_rank
1Dmitry Sokolov2200001
1Anna Ivanova2100002
1Igor Petrov1950003
1Pavel Smirnov1800004
1Elena Kozlova1750005
2Irina Volkova2050001
2Olga Novikova2000002
2Maxim Morozov1600003
2Nikita Popov1600003
3Tatiana Lebedeva1700001

Подробности

Чтобы выбрать строки с первыми местами, посчитайте ранг в подзапросе и отфильтруйте во внешнем запросе: в WHERE того же запроса оконные функции использовать нельзя. В отличие от ROW_NUMBER, строки с одинаковыми значениями получают одно место, поэтому условие «ранг = 1» вернёт всех лидеров.

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

Где изучить