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

ROW_NUMBER

Нумерує рядки 1, 2, 3… у заданому порядку — у всьому результаті або в кожній групі.

Синтаксис

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

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

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

employees

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

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

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

Emma і Sophia заробляють однаково, але номери в них різні — хто буде другим, вирішує випадок. Детальніше — у розділі «Зверни увагу».

Нумерація заново в кожному відділі
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS place
FROM employees;
namedepartmentsalaryplace
Emmabackend12001
Liambackend10002
Sophiadesign12001
Oliviafrontend13501
Noahfrontend9502
Найбільша зарплата в кожному відділіСкладніше
SELECT name, department, salary
FROM (
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS place
FROM employees
) ranked
WHERE place = 1;
namedepartmentsalary
Emmabackend1200
Sophiadesign1200
Oliviafrontend1350

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

Зверни увагу

Однакові значення все одно отримують різні номери, і хто з них буде першим — випадковість. Додай до ORDER BY унікальне поле, наприклад id, щоб порядок був стабільним.

Потрібні однакові місця для однакових значень — бери RANK або DENSE_RANK.

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

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