📁 Блок: SQL / MySQL / Оконные функции⏱️ Время изучения: ~90 мин🎯 Сложность: Продвинутая
⚡ Минимум для запоминания
ROW_NUMBER() OVER (ORDER BY col) — уникальный номер строки.
RANK() OVER (ORDER BY col) — ранг с пропусками.
DENSE_RANK() OVER (ORDER BY col) — ранг без пропусков.
NTILE(n) OVER (ORDER BY col) — разделение на n групп.
PARTITION BY задаёт группу, внутри которой ведётся ранжирование.
Общий синтаксис
-- Ранжирование по всей таблице
ranking_function() OVER (ORDER BY column) AS alias
-- Ранжирование внутри группы
ranking_function() OVER (
PARTITION BY column
ORDER BY column
) AS alias
-- Разбиение на n групп
NTILE(n) OVER (ORDER BY column) AS alias
Команды / операторы / функции
Функция
Назначение
Пример
ROW_NUMBER()
Уникальный номер строки в окне
ROW_NUMBER() OVER (ORDER BY SaleDate)
RANK()
Ранг с пропусками при равенстве
RANK() OVER (PARTITION BY DepartmentID ORDER BY SaleAmount DESC)
DENSE_RANK()
Ранг без пропусков при равенстве
DENSE_RANK() OVER (ORDER BY SaleAmount DESC)
NTILE(n)
Разделение строк на n равных групп
NTILE(4) OVER (ORDER BY list_price)
OVER
Определяет окно строк для функции
OVER (PARTITION BY DepartmentID ORDER BY SaleAmount DESC)
Важные нюансы
Все ранжирующие функции требуют ORDER BY внутри OVER.
ROW_NUMBER() всегда возвращает уникальные значения в окне, даже при полном совпадении строк.
RANK() и DENSE_RANK() дают одинаковый ранг строкам с одинаковыми значениями в ORDER BY.
NTILE(n) распределяет строки так, чтобы группы отличались не более чем на одну строку.