Описание тега window-functions
В качестве основного примера оконной функции рассмотрим таблицу, содержащую список лиц с указанием их возраста и пола.
Если вы хотите, чтобы запрос возвращал полный список людей с указанием их возрастного ранга по полу, вы могли бы сделать это проще всего, используя функцию окна ранжирования.
Такую функцию можно использовать для ранжирования отдельных строк в подмножестве результатов.
При использовании оконной функции вышеуказанная функция будет выглядеть так:
SELECT name,
age,
gender,
RANK() OVER (PARTITION BY gender ORDER BY age DESC) AS age_rank
FROM persons
Оконные функции, определенные стандартом SQL, также могут обращаться к строкам до и после текущей строки с помощью lag()
или lead()
функция. Следующий запрос вычисляет дельту предыдущей строки для столбца суммы для каждого клиента:
SELECT customer_id,
order_date,
amount,
amount - lag(amount) over (partition by customer_id ORDER BY order_date) as delta
FROM order
ORDER BY customer_id, order_date;
Стандартные агрегаты (например, count()
, sum()
) также можно использовать как оконную функцию. В сочетании сORDER BY
(внутри определения раздела) это будет генерировать "текущие" итоги на основе используемого агрегата.
Оконные функции доступны в широком спектре СУБД: Oracle (называемых здесь "аналитическими функциями"), Microsoft SQL Server, DB2 (называемыми здесь "функциями olap"), PostgreSQL, Teradata, Sybase, Vertica и частично в базе данных H2.