Что такое оконные функции (ROW_NUMBER, RANK, LEAD, LAG, PARTITION BY)?

Оконные функции в SQL позволяют вычислять значения по набору строк, не сворачивая результат в одну строку, как это делает GROUP BY. Для них используют OVER с PARTITION BY и часто ORDER BY; к таким функциям относятся ROW_NUMBER, RANK, LEAD и LAG.
Подробный ответ

Что такое оконные функции

Оконные функции вычисляют значение для каждой строки на основе набора связанных строк, который называется окном. При этом строки не схлопываются в одну итоговую запись, как при GROUP BY.

Они почти всегда пишутся через OVER (...) . Внутри окна обычно указывают PARTITION BY для разбиения на группы и ORDER BY для порядка строк.

PARTITION BY

PARTITION BY разбивает строки на независимые группы. Например, можно считать ранги отдельно для каждого отдела.

ROW_NUMBER

ROW_NUMBER() присваивает каждой строке уникальный порядковый номер внутри окна. При одинаковых значениях номера всё равно будут разными.

RANK

RANK() тоже ставит места по порядку, но одинаковые значения получают один и тот же ранг, а следующая позиция пропускается.

LAG и LEAD

LAG() позволяет посмотреть на значение предыдущей строки, а LEAD() — на значение следующей строки. Это удобно для сравнения соседних записей, например дат или цен.

Пример

SELECT
  id,
  department,
  salary,
  ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn,
  RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rnk,
  LAG(salary) OVER (PARTITION BY department ORDER BY salary DESC) AS prev_salary,
  LEAD(salary) OVER (PARTITION BY department ORDER BY salary DESC) AS next_salary
FROM employees;

Как ответить на собеседовании

Оконные функции нужны, когда надо считать что-то по строкам, но не терять детализацию. PARTITION BY делит данные на группы, ORDER BY задаёт порядок внутри группы, ROW_NUMBER нумерует строки, RANK делает ранжирование с пропусками, а LAG и LEAD позволяют сравнивать текущую строку с соседними.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге