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

PERCENT_RANK

Возвращает относительный ранг строки в разделе окна — долю строк, которые стоят раньше неё.

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

Параметры

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

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

Дробное число (DOUBLE) от 0 до 1

Примеры

Доля по дате рождения

MySQL 8.1
SELECT member_name,
	birthday,
	RANK() OVER (
		ORDER BY birthday
	) AS birthday_rank,
	PERCENT_RANK() OVER (
		ORDER BY birthday
	) AS birthday_percent_rank
FROM FamilyMembers;
member_namebirthdaybirthday_rankbirthday_percent_rank
Headley Quincey1960-05-1310
Ernest Forrest1961-09-1120.14285714285714285
Flavia Quincey1963-02-1630.2857142857142857
Constance Forrest1968-09-0640.42857142857142855
Andie Quincey1983-06-0550.5714285714285714
Lela Quincey1985-06-0760.7142857142857143
Annie Quincey1988-04-1070.8571428571428571
Wednesday Addams2005-01-1381

Положение зарплаты в отделе

MySQL 8.1
SELECT department_id,
	name,
	salary,
	ROUND(
		PERCENT_RANK() OVER (
			PARTITION BY department_id
			ORDER BY salary
		),
		2
	) AS salary_percent_rank
FROM employees;
department_idnamesalarysalary_percent_rank
1Elena Kozlova1750000
1Pavel Smirnov1800000.25
1Igor Petrov1950000.5
1Anna Ivanova2100000.75
1Dmitry Sokolov2200001
2Maxim Morozov1600000
2Nikita Popov1600000
2Olga Novikova2000000.67
2Irina Volkova2050001
3Andrey Kozlov1400000

Подробности

Значение считается по формуле (RANK() - 1) / (число строк в разделе - 1): у первой строки 0, у последней 1. Строки с одинаковыми значениями ORDER BY получают одну долю, как одно место у RANK. В разделе из одной строки результат 0.

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