Віконністандарт SQL

NTILE

Ділить рядки на задану кількість груп приблизно однакового розміру й нумерує групи.

Синтаксис

NTILE(<кількість груп>) OVER (ORDER BY <критерій>)
NTILE(<кількість груп>) OVER (PARTITION BY <група> ORDER BY <критерій>)

Розкладає впорядковані рядки на N груп і каже, в якій групі кожен рядок: 1, 2, …, N. Якщо рядки не діляться порівну, зайві дістаються першим групам. Так ділять на половини, третини чи чверті: «дорожча половина замовлень», «верхні 25 % за зарплатою».

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

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 name, salary,
NTILE(2) OVER (ORDER BY salary DESC) AS half
FROM employees;
namesalaryhalf
Olivia13501
Emma12001
Sophia12001
Liam10002
Noah9502

5 рядків на дві групи порівну не діляться, тому перша група більша: 3 і 2.

Три групи замовлень за сумою
SELECT id, amount,
NTILE(3) OVER (ORDER BY amount DESC) AS bucket
FROM orders;
idamountbucket
3199.991
1120.501
280.252
564.752
445.003
Лише дорожча половина замовленьСкладніше
SELECT id, amount
FROM (
SELECT id, amount,
NTILE(2) OVER (ORDER BY amount DESC) AS half
FROM orders
) split
WHERE half = 1;
idamount
3199.99
1120.50
280.25

Зверни увагу

Групи рівні за кількістю рядків, а не за значеннями. Однакові суми можуть потрапити в різні групи, а межі груп — випадати будь-де.

Якщо груп більше, ніж рядків, частина груп лишиться порожньою: NTILE(10) для 5 рядків дасть номери від 1 до 5.

Використати результат у WHERE того самого запиту не можна — спершу порахуй його в підзапиті, а фільтруй уже зовні.

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

Детально в курсі