Оконные функции в YQL
Агрегатные функции
Все агрегатные функции также могут использоваться в роли оконных. В этом случае на каждой строке оказывается результат агрегации, примененный к текущему положению окна (по умолчанию от начала партиции до текущей строки, включительно).
Примеры
SELECT
SUM(int_column) OVER w AS running_total
FROM my_table
WINDOW w AS ();
ROW_NUMBER
Номер строки в рамках партиции. Без аргументов.
Примеры
SELECT
ROW_NUMBER() OVER w AS row_num
FROM my_table
WINDOW w AS ();
LAG / LEAD
Доступ к значению из строки, отстающей (LAG
) или опережающей (LEAD
) текущую на фиксированное число. В первом аргументе указывается выражение, к которому необходим доступ, а во втором — отступ в строках. Отступ можно не указывать, по умолчанию используется соседняя строка — предыдущая или следующая, соответственно, то есть подразумевается 1. В строках, для которых нет соседей с заданным расстоянием (например LAG(expr, 3)
в первой и второй строках окна) значение выражения — NULL
.
Примеры
SELECT
int_value - LAG(int_value) OVER w AS int_value_diff
FROM my_table
WINDOW w AS ();
FIRST_VALUE / LAST_VALUE
Доступ к значениям из первой и последней строк окна. Единственный аргумент — выражение, к которому необходим доступ.
Опционально перед OVER
может указываться дополнительный модификатор IGNORE NULLS
, который меняет поведение функций на первое или последнее не пустое (то есть не NULL
) значение среди строк окна. Антоним этого модификатора — RESPECT NULLS
является поведением по умолчанию и может не указываться.
Примеры
SELECT
LAST_VALUE(my_column) IGNORE NULLS OVER w
FROM my_table
WINDOW w AS ();
RANK / DENSE_RANK
Пронумеровать группы соседних строк с одинаковыми значением выражения в аргументе. DENSE_RANK
нумерует группы подряд, а RANK
— пропускает (N - 1)
значений, где N
— число строк в предыдущей группе.
При отсутствии аргумента использует порядок, указанный в секции ORDER BY.
Примеры
SELECT
RANK(my_column) OVER w
FROM my_table
WINDOW w AS ();
SELECT
RANK() OVER w
FROM my_table
WINDOW w AS (ORDER BY my_column);