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

DENSE_RANK

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

Синтаксис

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

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

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

employees

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

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

Місця без пропусків
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS place
FROM employees;
namesalaryplace
Olivia13501
Emma12002
Sophia12002
Liam10003
Noah9504

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

RANK і DENSE_RANK поруч
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS rank,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;
namesalaryrankdense_rank
Olivia135011
Emma120022
Sophia120022
Liam100043
Noah95054
Друга за величиною зарплатаСкладніше
SELECT name, salary
FROM (
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS place
FROM employees
) ranked
WHERE place = 2;
namesalary
Emma1200
Sophia1200

Класичне завдання зі співбесід. DENSE_RANK знаходить саме друге значення, скільки б людей його не мали.

Зверни увагу

DENSE_RANK не каже, скільки людей вище: у Liam місце 3, хоча перед ним троє. Потрібна позиція з урахуванням усіх — бери RANK.

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

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

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