WINDOW
Предложение WINDOW предназначено для задания именованных окон, которые используются оконными функциями.Поскольку выражение окна может быть довольно сложным, и использоваться многократно, такая функциональность бывает полезной.
<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>
<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 preceding> | <window frame between>
<window frame preceding> ::=
UNBOUNDED PRECEDING | <expr> PRECEDING | CURRENT ROW
<window frame between> ::=
BETWEEN { UNBOUNDED PRECEDING | <expr> PRECEDING | <expr> FOLLOWING | CURRENT ROW }
AND { UNBOUNDED FOLLOWING | <expr> PRECEDING | <expr> FOLLOWING | CURRENT ROW }
Имя окна может быть использовано в предложении OVER для ссылки на определение окна, кроме того оно может бытьиспользовано в качестве базового окна для другого именованного или встроенного (в предложении OVER) окна.Окна с рамкой (с предложениями RANGE и ROWS) не могут быть использованы в качестве базового окна, но могут бытьиспользованы в предложении OVER window_name. Окно, которое использует ссылку на базовое окно, не может иметь предложение PARTITION BY и не может переопределять сортировку с помощью предложения ORDER BY.
Примеры
SELECT
id,
department,
salary,
count(*) OVER w1,
first_value(salary) OVER w2,
last_value(salary) OVER w2,
sum(salary) over (w2 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) AS s
FROM employee
WINDOW w1 AS (PARTITION BY department),
w2 AS (w1 ORDER BY salary)
ORDER BY department, salary;