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

PERCENTILE_CONT

Возвращает процентиль — значение, ниже которого лежит заданная доля значений группы; между соседними значениями вычисляет промежуточное.

PostgreSQL 17.5
PERCENTILE_CONT(fraction) WITHIN GROUP (ORDER BY expression)

Параметры

fractiondouble precision
Доля от 0 до 1, например 0.5 для медианы; можно передать массив долей
expressiondouble precision | interval
Числовое выражение или интервал, по которому упорядочиваются значения

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

Число (double precision) или интервал; массив, если fraction — массив; NULL для пустого набора

Примеры

Медиана и среднее цен

PostgreSQL 17.5
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (
		ORDER BY unit_price
	) AS median,
	AVG(unit_price) AS average
FROM Payments;
medianaverage
1503231.1785714285714286

Медиана цены у каждого члена семьи

PostgreSQL 17.5
SELECT family_member,
	PERCENTILE_CONT(0.5) WITHIN GROUP (
		ORDER BY unit_price
	) AS median_price
FROM Payments
GROUP BY family_member
ORDER BY family_member;
family_membermedian_price
19
2150
3100
4250
5230

Квартили одним вызовом

PostgreSQL 17.5
SELECT PERCENTILE_CONT(ARRAY [0.25, 0.5, 0.75]) WITHIN GROUP (
		ORDER BY unit_price
	) AS quartiles
FROM Payments;
quartiles
19150312.5

Подробности

У функции особая запись: выражение указывается не в скобках, а в WITHIN GROUP (ORDER BY ...). Значения NULL не учитываются.

Если нужная позиция попадает между двумя значениями, результат вычисляется между ними: для 1, 2, 3 и 10 медиана — 2.5. Чтобы получить одно из существующих значений, используйте PERCENTILE_DISC. В отличие от AVG, медиана почти не зависит от редких очень больших значений.

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