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;Места по зарплате в отделах
MySQL 8.1
SELECT department_id,
name,
salary,
RANK() OVER (
PARTITION BY department_id
ORDER BY salary DESC
) AS salary_rank
FROM employees;Подробности
Чтобы выбрать строки с первыми местами, посчитайте ранг в подзапросе и отфильтруйте во внешнем запросе: в WHERE того же запроса оконные функции использовать нельзя. В отличие от ROW_NUMBER, строки с одинаковыми значениями получают одно место, поэтому условие «ранг = 1» вернёт всех лидеров.