Список оконных функций в 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);
SELECT item, odd, LAG(item, 1) OVER w as lag1 FROM (
SELECT item, item % 2 as odd FROM (
SELECT AsList(1, 2, 3, 4, 5, 6, 7) as item
)
FLATTEN BY item
)
WINDOW w As (
PARTITION BY odd
ORDER BY item
);
/* Output:
item odd lag1
--------------------
2 0 NULL
4 0 2
6 0 4
1 1 NULL
3 1 1
5 1 3
7 1 5
*/
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);
NTH_VALUE
Доступ к значения из заданной строки (в порядке ORDER BY на окне) рамки окна. Аргументы - выражение, к которому необходим доступ и номер строки, начиная с 1.
Опционально перед OVER может указываться дополнительный модификатор IGNORE NULLS, который приводит к пропуску строк с NULL в значении первого аргумента. Антоним этого модификатора — RESPECT NULLS является поведением по умолчанию и может не указываться.
Сигнатура
NTH_VALUE(T,N)->T?
Примеры
SELECT
NTH_VALUE(my_column, 2) OVER w
FROM my_table
WINDOW w AS (ORDER BY key);
SELECT
NTH_VALUE(my_column, 3) IGNORE NULLS OVER w
FROM my_table
WINDOW w AS (ORDER BY key);
RANK / DENSE_RANK / PERCENT_RANK
Пронумеровать группы соседних строк раздела с одинаковым значением выражения в аргументе. DENSE_RANK нумерует группы подряд, а RANK — пропускает (N - 1) значений, где N — число строк в предыдущей группе. PERCENT_RANK выдает относительный ранг текущей строки: (RANK - 1)/(число строк в разделе - 1).
При отсутствии аргумента использует порядок, указанный в секции ORDER BY определения окна.
Если аргумент отсутствует и ORDER BY не указан, то все строки считаются равными друг другу.
Примечание
Возможность передавать аргумент в RANK/DENSE_RANK/PERCENT_RANK является нестандартным расширением YQL.
Сигнатура
RANK([T])->Uint64
DENSE_RANK([T])->Uint64
PERCENT_RANK([T])->Double
Примеры
SELECT
RANK(my_column) OVER w
FROM my_table
WINDOW w AS (ORDER BY key);
SELECT
DENSE_RANK() OVER w
FROM my_table
WINDOW w AS (ORDER BY my_column);
SELECT
PERCENT_RANK() OVER w
FROM my_table
WINDOW w AS (ORDER BY my_column);
NTILE
Распределяет строки упорядоченного раздела в заданное количество групп. Группы нумеруются, начиная с единицы. Для каждой строки функция NTILE возвращает номер группы,которой принадлежит строка.
Сигнатура
NTILE(Uint64)->Uint64
Примеры
SELECT
NTILE(10) OVER w AS group_num
FROM my_table
WINDOW w AS (ORDER BY key);
CUME_DIST
Возвращает относительную позицию (> 0 и <= 1) строки в рамках раздела. Без аргументов.
Сигнатура
CUME_DIST()->Double
Примеры
SELECT
CUME_DIST() OVER w AS dist
FROM my_table
WINDOW w AS (ORDER BY key);
SessionState()
Нестандартная оконная функция SessionState() (без аргументов) позволяет получить состояние расчета сессий из SessionWindow для текущей строки.
Допускается только при наличии SessionWindow() в секции PARTITION BY определения окна.