Агрегатністандарт SQL

PERCENTILE_DISC

Знаходить перцентиль серед наявних значень — медіану, яка точно є в даних.

Синтаксис

PERCENTILE_DISC(<частка>) WITHIN GROUP (ORDER BY <вираз>)

Сортує значення й повертає перше, на якому набирається задана частка рядків. На відміну від PERCENTILE_CONT, не вигадує середини між двома значеннями, тож працює й з датами та текстом.

Дані для прикладів

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

orders

idcreated_atamount
12026-07-03 10:15:00120.50
22026-07-28 18:40:0080.25
32026-08-09 09:05:00199.99
42026-08-21 14:30:0045.00
52026-09-02 11:00:0064.75

Ці таблиці вже створено в пісочниці — приклади нижче працюють із ними. Хочеш повторити у своїй базі — скопіюй SQL.

Медіана зарплати
SELECT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY salary) AS median_salary
FROM employees;
median_salary
1200
CONT проти DISC у кожному відділі
SELECT department,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) AS cont,
PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY salary) AS disc
FROM employees
GROUP BY department
ORDER BY department;
departmentcontdisc
backend11001000
design12001200
frontend1150950

У backend дві зарплати: CONT бере середину між ними — 1100, а DISC — меншу з наявних, 1000.

Медіанна дата замовлення
SELECT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY created_at) AS median_order
FROM orders;
median_order
2026-08-09 09:05:00

PERCENTILE_CONT із датами не працює, а DISC просто бере одну з наявних.

Зверни увагу

При парній кількості значень бере менше з двох середніх: для 1000 і 1200 — 1000, а не 1100.

Синтаксис той самий, що в PERCENTILE_CONT: частка від 0 до 1 у дужках, а стовпець — у WITHIN GROUP (ORDER BY …).

Віконною функцією з OVER не буває: OVER is not supported for ordered-set aggregate percentile_disc.

Схожі функції