← К оглавлению занятия

🔖 Справочник: команды и синтаксис

📁 Блок: 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) распределяет строки так, чтобы группы отличались не более чем на одну строку.

Полный справочник

→ Справочник SQL