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

CUME_DIST

Возвращает накопленную долю: какая часть строк раздела стоит не позже текущей.

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

Параметры

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

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

Дробное число (DOUBLE) больше 0 и не больше 1

Примеры

CUME_DIST и PERCENT_RANK по статусу

MySQL 8.1
SELECT member_name,
	status,
	CUME_DIST() OVER (
		ORDER BY status
	) AS status_cume_dist,
	PERCENT_RANK() OVER (
		ORDER BY status
	) AS status_percent_rank
FROM FamilyMembers;
member_namestatusstatus_cume_diststatus_percent_rank
Lela Quinceydaughter0.3750
Annie Quinceydaughter0.3750
Wednesday Addamsdaughter0.3750
Headley Quinceyfather0.6250.42857142857142855
Ernest Forrestfather0.6250.42857142857142855
Flavia Quinceymother0.8750.7142857142857143
Constance Forrestmother0.8750.7142857142857143
Andie Quinceyson11

Самая дешёвая четверть товаров

MySQL 8.1
SELECT name,
	price
FROM (
		SELECT name,
			price,
			CUME_DIST() OVER (
				ORDER BY price
			) AS share_cheaper_or_equal
		FROM products
	) AS t
WHERE share_cheaper_or_equal <= 0.25;
nameprice
Mineral Water 1L1.99
Coca-Cola 0.5L2.49
Chips Pack2.99

Подробности

Значение — число строк со значением ORDER BY не больше текущего, делённое на число строк в разделе. В отличие от PERCENT_RANK, текущая строка и равные ей тоже входят в долю, поэтому результат никогда не равен 0, а у последней строки равен 1. Условие CUME_DIST() <= 0.25 во внешнем запросе выбирает первую четверть строк.

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