SQLLab
Глоссарий/ROW_NUMBER / RANK / DENSE_RANK
Оконные функцииСредний

ROW_NUMBER / RANK / DENSE_RANK

Оконные функции нумерации строк. Различаются поведением при одинаковых значениях.

Синтаксис
ROW_NUMBER() OVER ([PARTITION BY col] ORDER BY col)
RANK() OVER (...)
DENSE_RANK() OVER (...)

Объяснение

ROW_NUMBER(): уникальный номер для каждой строки, без пропусков. RANK(): одинаковые значения получают одинаковый ранг, следующий ранг пропускается (1,1,3). DENSE_RANK(): одинаковые значения получают одинаковый ранг, пропуска нет (1,1,2). Часто используется для топ-N в группе: ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC), потом WHERE rn <= 3.

Пример

-- Топ-3 сотрудника по зарплате в каждом отделе
WITH ranked AS (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) AS rn
  FROM employees
)
SELECT * FROM ranked WHERE rn <= 3;