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

RANK

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

Синтаксис

RANK() OVER (ORDER BY <критерій>)
RANK() OVER (PARTITION BY <група> ORDER BY <критерій>)

Як на змаганнях: двоє з однаковим результатом ділять друге місце, а наступний стає четвертим, бо третє вже «зайняте». Віконна функція: рядків не меншає, кожен отримує своє місце. PARTITION BY рахує місця окремо в кожній групі.

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

employees

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

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

Місця за зарплатою
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS place
FROM employees;
namesalaryplace
Olivia13501
Emma12002
Sophia12002
Liam10004
Noah9505

Emma і Sophia заробляють однаково й ділять друге місце, тому Liam — четвертий.

ROW_NUMBER, RANK і DENSE_RANK поруч
SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_number,
RANK() OVER (ORDER BY salary DESC) AS rank,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;
namesalaryrow_numberrankdense_rank
Olivia1350111
Emma1200222
Sophia1200322
Liam1000443
Noah950554
Дві найбільші зарплати разом із рівнимиСкладніше
SELECT name, salary
FROM (
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS place
FROM employees
) ranked
WHERE place <= 2;
namesalary
Olivia1350
Emma1200
Sophia1200

Людей виходить троє, бо друге місце ділять двоє. З ROW_NUMBER одна з них випала б.

Зверни увагу

Після рівних місця пропускаються: 1, 2, 2, 4. Потрібно без пропусків — 1, 2, 2, 3 — бери DENSE_RANK.

Без ORDER BY в OVER усі рядки вважаються рівними й отримують місце 1.

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

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

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