Назад к вопросам
Middle+
73
questionbank
Что такое оконные функции?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Оконная функция вычисляет значение для каждой строки, основываясь на "окне" или наборе строк, связанных с текущей строкой. Это похоже на агрегирующие функции (SUM, AVG, COUNT), но они не группируют результат в одну строку для каждой группы, а предоставляют агрегированное значение для каждой отдельной строки из исходного набора данных.
Основные компоненты:
- Функция: Сама оконная функция (например,
ROW_NUMBER(),RANK(),DENSE_RANK(),LAG(),LEAD(),SUM(),AVG()). OVER(): Определяет, что это оконная функция.PARTITION BY(опционально): Делит строки на разделы, к которым применяется оконная функция независимо.ORDER BY(обязательно в большинстве случаев): Определяет порядок строк внутри каждого раздела, важный для таких функций, какROW_NUMBER,LAG,LEAD.ROWSилиRANGE(опционально): Определяет фрейм окна - подмножество строк внутри раздела, к которому применяется функция. По умолчанию часто используется весь раздел.
Часто используемые оконные функции:
ROW_NUMBER(): Присваивает уникальный последовательный номер каждой строке в разделе.RANK(): Присваивает ранг строкам в разделе. Строки с одинаковыми значениями получают одинаковый ранг, следующему рангу пропускается столько номеров, сколько было повторяющихся значений.DENSE_RANK(): Похож наRANK(), но не пропускает номера рангов.LAG(column, offset, default): Получает значение из строки, предшествующей текущей на заданное смещение.LEAD(column, offset, default): Получает значение из строки, следующей за текущей на заданное смещение.- Агрегирующие функции (
SUM,AVG,COUNT,MIN,MAX) могут использоваться как оконные для получения скользящих или кумулятивных агрегатов.
Пример использования:
-- Пример использования оконной функции RANK() для ранжирования сотрудников по зарплате в каждом отделе.
SELECT
employee_name,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) as rank_in_department
FROM
employees;