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;