Оконные функции
Оконные функции — функции, которые выполняют вычисления внутри заданного набора данных или "окна" в таблице БД.
Принцип работы
- Оконная функция (ОФ) определяет "окно" данных, на которых будет выполняться вычисление (несколько строк или диапазон значений столбца).
- Если требуется, данные внутри окна упорядочиваются по одному или нескольким столбцам.
- Применяются вычисления, заданные в ОФ (сумма, среднее значение, ранжирование и т.д.).
- Если требуется, результаты группируются по столбцам или выражениям.
- Возврат результатов.
Упрощенный синтаксис
<имя функции> OVER (<окно>)
где имя функции = имя оконной функции,
окно = выражение, описывающее набор строк для обработки и порядок обработки.
Характеристики
- В отличие от агрегатных функций, оконные могут вычислять значения для каждой строки в результате запроса. Агрегатные работают над всем набором данных.
- ОФ не уменьшают количество строк, а возвращают столько значений, сколько получили на вход.
- В отличие от
GROUP BY,OVERможет обращаться к другим строкам.
Как используются?
- Для определения порядка строк и их ранжирования в рамках группы данных.
- Например, можно выделить наиболее ранний или поздний заказ для каждого клиента.
- Применение фильтров к результирующему набору данных по условиям внутри функции.
- Для выполнения вычислений на группах данных без создания временных таблиц или подзапросов.
- Обращения к данным из други х строк в пределах окна. Полезно для сравнения значений или расчета разницы между значениями.
Виды
- Агрегатные — вычисляют агрегированные значения по группам строк в окне.
- Пример: среднее значение или сумма всех значений в окне.
- Ранжирующие — назначают ранг каждой строке в пределах окна в соответствии с заданными критериями сортировки.
- Пример: можно ранжировать товары по их цене в каждой категории.
ROW_NUMBER— возвращает номер строки, используется для нумерации.RANK— возвращает ранг каждой строки.
- Смещения — позволяют перемещаться и обращаться к разным строкам в окне относительно текущей строки.
LAG— обращается к данным из предыдущих строк окна.LEAD— обращается к данным из следующих строк. АналогичноLAGимеет 3 аргумента.
Примеры
Ранжирование данных
SELECT student_id, test_score,
RANK() OVER (ORDER BY test_score DESC) AS rank
FROM student_scores;
Вычисление среднего значения по группам
SELECT region, sales_amount,
AVG(sales_amount) OVER (PARTITION BY region) AS avg_sales_per_region
FROM sales_data;
Окно vs Партиция в оконных функциях
Окно
Набор строк внутри результата запроса, на котором выполняется операция агрегации или аналитическая функция.
Пример: вычисление среднего балла каждого студента по последним трем тестам. ОФ определит "окно", которое охватывает последние три записи для каждого студента, и вычислит средний балл только в этом окне данных.
Партиция (PARTITION BY)
Подмножество строк, выделенное для ОФ по одному или нескольким столбцам в таблице. Задает условие, по которому эти строки группируются для вычисления функций.
Пример: вычисление суммы продаж в каждом регионе. Партиция разделит данные на группы по регионам, после чего сумма продаж вычисляется в каждой группе отдельно.
Окно определяет, где выполняется функция, а партиция - как данные группируются для выполнения этой функции.
Недостатки оконных функций
- Не все СУБД их поддерживают.
- Производительность может ухудшаться из-за их влияния на выполнение запроса.
- Отладка может быть затруднительна.
Подборка материалов по оконным функциям
- Оконные функции SQL простым языком с примерами
- Оконные функции
- Учимся применять оконные функции
- Оконные функции в SQL — что это и зачем они нужны
- Оконные функции с примерами
- Clickhouse — оконные функции, которых нет
- Партиции в оконных функциях
- Зачем вам оконные функции в Apache Spark
- Python Pandas — оконные функции
- Оконные функции в SQL и их родственники в Python
- Оконные функции SQL
- Оконные функции в Postgres
- Группировки и оконные функции в Oracle
- Магия оконных функций (на примере PostgreSQL)
- Как посчитать всё на свете одним SQL-запросом. Оконные функции PostgreSQL
- Оконные функции: сравнение
- Оконные функции: ограничения, синтаксис
Видео
- Оконные функции SQL за 13 минут
- Как применять оконные функции в SQL и Pandas | Анатолий Карпов
- Оконные функции RANK и LAG | Анатолий Карпов
- Цикл видео "Расширенные возможности SQL" (границы ОФ, агрегатные ОФ, аналитические ОФ, ранжирующие ОФ)