Список оконных функций в YQL
Синтаксис вызова оконных функций подробно описан в отдельной статье.
Агрегатные функции
Все агрегатные функции также могут использоваться в роли оконных.
В этом случае на каждой строке оказывается результат агрегации, полученный на множестве строк из рамки окна.
Примеры:
SELECT
SUM(int_column) OVER w1 AS running_total,
SUM(int_column) OVER w2 AS total,
FROM my_table
WINDOW
w1 AS (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
w2 AS ();
ROW_NUMBER
Номер строки в рамках раздела. Без аргументов.
Сигнатура
ROW_NUMBER()->Uint64
Примеры
SELECT
ROW_NUMBER() OVER w AS row_num
FROM my_table
WINDOW w AS (ORDER BY key);
LAG / LEAD
Доступ к значению из строки раздела, отстающей (LAG
) или опережающей (LEAD
) текущую на фиксированное число. В первом аргументе указывается выражение, к которому необходим доступ, а во втором — отступ в строках. Отступ можно не указывать, по умолчанию используется соседняя строка — предыдущая или следующая, соответственно, то есть подразумевается 1. В строках, для которых нет соседей с заданным расстоянием (например LAG(expr, 3)
в первой и второй строках раздела), возвращается NULL
.
Сигнатура
LEAD(T[,Int32])->T?
LAG(T[,Int32])->T?
Примеры
SELECT
int_value - LAG(int_value) OVER w AS int_value_diff
FROM my_table
WINDOW w AS (ORDER BY key);
FIRST_VALUE / LAST_VALUE
Доступ к значениям из первой и последней (в порядке ORDER BY
на окне) строк рамки окна. Единственный аргумент - выражение, к которому необходим доступ.
Опционально перед OVER
может указываться дополнительный модификатор IGNORE NULLS
, который меняет поведение функций на первое или последнее не пустое (то есть не NULL
) значение среди строк рамки окна. Антоним этого модификатора — RESPECT NULLS
является поведением по умолчанию и может не указываться.
Сигнатура
FIRST_VALUE(T)->T?
LAST_VALUE(T)->T?
Примеры
SELECT
FIRST_VALUE(my_column) OVER w
FROM my_table
WINDOW w AS (ORDER BY key);
SELECT
LAST_VALUE(my_column) IGNORE NULLS OVER w
FROM my_table
WINDOW w AS (ORDER BY key);
RANK / DENSE_RANK
Пронумеровать группы соседних строк раздела с одинаковым значением выражения в аргументе. DENSE_RANK
нумерует группы подряд, а RANK
— пропускает (N - 1)
значений, где N
— число строк в предыдущей группе.
При отсутствии аргумента использует порядок, указанный в секции ORDER BY
определения окна.
Если аргумент отсутствует и ORDER BY
не указан, то все строки считаются равными друг другу.
Примечание
Возможность передавать аргумент в RANK
/DENSE_RANK
является нестандартным расширением YQL.
Сигнатура
RANK([T])->Uint64
DENSE_RANK([T])->Uint64
Примеры
SELECT
RANK(my_column) OVER w
FROM my_table
WINDOW w AS (ORDER BY key);
SELECT
RANK() OVER w
FROM my_table
WINDOW w AS (ORDER BY my_column);
SessionState()
Нестандартная оконная функция SessionState()
(без аргументов) позволяет получить состояние расчета сессий из SessionWindow для текущей строки.
Допускается только при наличии SessionWindow()
в секции PARTITION BY
определения окна.