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

CUME_DIST

Возвращает долю строк раздела окна, которые стоят перед текущей строкой или вместе с ней, от 0 до 1.

PostgreSQL 17.5
CUME_DIST() OVER ([PARTITION BY ...] [ORDER BY ...])

Параметры

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

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

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

Примеры

PERCENT_RANK и CUME_DIST

PostgreSQL 17.5
SELECT unit_price,
	ROUND(
		PERCENT_RANK() OVER (
			ORDER BY unit_price
		)::numeric,
		3
	) AS pct_rank,
	ROUND(
		CUME_DIST() OVER (
			ORDER BY unit_price
		)::numeric,
		3
	) AS cume_dist
FROM Payments
ORDER BY unit_price;
unit_pricepct_rankcume_dist
70.0000.071
70.0000.071
80.0740.179
80.0740.179
80.0740.179
100.1850.214
160.2220.250
200.2590.286
590.2960.321
1000.3330.393

Доля платежей не дороже текущего

PostgreSQL 17.5
SELECT family_member,
	unit_price,
	ROUND(
		CUME_DIST() OVER (
			PARTITION BY family_member
			ORDER BY unit_price
		)::numeric,
		2
	) AS share_not_more
FROM Payments
ORDER BY family_member,
	unit_price;
family_memberunit_priceshare_not_more
170.25
170.25
180.50
180.50
1100.63
13000.75
120000.88
1100001.00
280.14
21200.29

Подробности

Считается как число строк со значением ORDER BY не больше текущего, делённое на число строк раздела. В отличие от PERCENT_RANK, результат никогда не равен 0, а у последней строки всегда равен 1.

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