SQL позволяют вычислять значения по набору строк, не сворачивая результат в одну строку, как это делает GROUP BY. Для них используют OVER с PARTITION BY и часто ORDER BY; к таким функциям относятся ROW_NUMBER, RANK, LEAD и LAG.
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 позволяют сравнивать текущую строку с соседними.
Оцени свой прогресс