Согласно SQL спецификации оконные функции (также известные как аналитические функции) являются своего рода агрегатными функциями, не уменьшающими степень детализации.При этом агрегированные данные выводятся вместе с неагрегированными.
Синтаксически вызов оконной функции есть указание её имени, за которым всегда следует ключевое слово OVER() с возможными аргументами внутри скобок.В этом и заключается её синтаксическое отличие от обычной функции или агрегатной функции.Оконные функции могут находиться только в списке SELECT и предложении ORDER BY.
Предложение OVER может содержать разбивку по группам ("секционирование"), сортировку и рамку окна.
DSQL
<window_function> ::=
<aggregate_function> OVER <window_name_or_spec>
| <window_function_name> ([<expr> [, <expr> ...]]) OVER <window_name_or_spec>
<window_name_or_spec> ::=
<window_specification> | window_name
<window_function_name> ::=
<ranking_function>
| <navigation_function>
<window_specification> ::=
([window_name] [<window_partition>] [<window_order>] [<window_frame>])
<window_partition> ::= PARTITION BY <expr> [, <expr> ...]
<window_order> ::=
ORDER BY <expr> [<direction>] [<nulls_placement>]
[, <expr> [<direction>] [<nulls_placement>] ...]
<direction> ::= ASC | DESC
<nulls_placement> ::= NULLS {FIRST | LAST}
<window_frame> ::=
{ROWS | RANGE} <window_frame_extent>
<window_frame_extent> ::=
<window_frame_start> | <window_frame_between>
<window_frame_start> ::=
UNBOUNDED PRECEDING | <expr> PRECEDING | CURRENT ROW
<window_frame_between> ::=
BETWEEN <window_frame_bound_1> AND <window_frame_bound_2>
<window_frame_bound_1> ::=
UNBOUNDED PRECEDING | <expr> PRECEDING | CURRENT ROW
| <expr> FOLLOWING
<window_frame_bound_2> ::=
<expr> PRECEDING | CURRENT ROW | <expr> FOLLOWING
| UNBOUNDED FOLLOWING
<aggregate_function> ::= Агрегатные функции
<ranking_function> ::=
DENSE_RANK
| RANK
| PERCENT_RANK
| CUME_DIST
| NTILE
| ROW_NUMBER
<navigation_function> ::=
LEAD
| LAG
| FIRST_VALUE
| LAST_VALUE
| NTH_VALUE
<query-spec> ::=
SELECT
[<first-clause>] [<skip-clause>]
[<distinct-clause>]
<select-list>
<from-clause>
[<where-clause>]
[<group-clause>]
[<having-clause>]
[<named-windows-clause>]
[<order-clause>]
[<rows-clause>]
[<offset-clause>] [<limit clause>]
[<plan-clause>]
<named-windows-clause> ::=
WINDOW <window-definition> [, <window-definition>] ...
<window-definition> ::=
window_name AS <window_specification>
| Параметр | Описание |
|---|---|
expr |
Выражение.Может содержать столбец таблицы, константу, переменную, выражение, скалярную или агрегатную функцию.Оконные функции в качестве выражения не допускаются. |
window_partition |
Выражение секционирования. |
window_order |
Выражение сортировки. |
window_frame |
Выражение для задания рамки окна. |
window_name |
Имя окна. |
direction |
Направление сортировки. |
nulls_placement |
Положение псевдозначения |
aggregate_function |
Агрегатная функция. |
ranking_function |
Ранжирующая функция. |
navigation_function |
Навигационная функция. |