Оконные функции позволяют выполнять вычисления в наборах строк, связанных с текущей строкой запроса.
Обратите внимание, что эти функции должны быть вызваны с использованием синтаксиса оконных функций, т. е. требуется предложение OVER.
Функция | Возвращаемый тип данных | Описание |
---|---|---|
cume_dist(value any) | double | Кумулятивное распределение: (количество строк раздела, предшествующих или родственных текущей строке) / (общее количество строк раздела) |
dense_rank(value any) | int | Ранг текущей строки без пропусков |
diff(value any) | boolean | Отличается ли значение текущей строки от других строк раздела |
diff(boolean, value any) | boolean | Отличается ли значение текущей строки от других строк раздела |
first_value(value any) | any | Возвращает значение, вычисленное в строке, которая является первой строкой в рамке окна |
lag(value any [, offset integer [, default any]]) | Тот же, что и value | Возвращает значение, вычисленное в строке, которая смещена на несколько строк вперед от текущей строки в разделе. Если такой строки нет, вместо нее возвращается значение по умолчанию. И смещение, и значение по умолчанию оцениваются по отношению к текущей строке. Если значение опущено, то смещение по умолчанию равно 1, а значение по умолчанию равно NULL. |
last_value(value any) | Тот же, что и value | Возвращает значение, вычисленное в строке, которая является последней строкой в рамке окна |
lead(value any [, offset integer [, default any]]) | Тот же, что и value | Возвращает значение, вычисленное в строке, которая смещена на несколько строк после текущей строки в разделе. Если такой строки нет, вместо нее возвращается значение по умолчанию. И смещение, и значение по умолчанию оцениваются по отношению к текущей строке. Если значение опущено, то смещение по умолчанию равно 1, а значение по умолчанию равно NULL. |
nth_value(value any, nth bigint) | Тот же, что и value | Возвращает значение, вычисленное в строке, которая является n-й строкой рамки окна (считая от 1). NULL, если такой строки нет. |
ntile(value any, num_buckects integer) | Тот же, что и num_buckects | Целое число от 1 до значения аргумента, делящее раздел максимально поровну |
percent_rank(value any) | double | Относительный ранг текущей строки: (ранг - 1) / (общее количество строк раздела - 1) |
rank(value any) | int | Ранг текущей строки с пропусками |
row_number(value any) | int | Номер текущей строки в своем разделе, считая от 1 |
В дополнение к вышеперечисленным оконным функциям некоторые агрегатные функции могут использоваться в качестве оконных. Агрегатные функции действуют как оконные только в том случае, если после вызова следует предложение OVER. В противном случае они действуют как неоконные агрегаты и возвращают одну строку для всего набора.
Когда агрегатная функция используется в качестве оконной функции, она агрегирует строки в рамке окна текущей строки.
Агрегатная функция, используемая с ORDER BY и определением рамки окна по умолчанию вычисляется как «бегущая сумма», что может не соответствовать желаемому результату. Чтобы получить агрегирование по всему разделу, опустите ORDER BY или используйте ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING. Для получения других эффектов можно использовать другие указания в определении рамки.
Функция | Возвращаемый тип данных |
---|---|
avg(numeric_expr) | double |
count(col_expr any, distinct boolean) | bigint или hugeint |
max(col_expr any) | Тот же, что и в col_expr |
min(col_expr any) | Тот же, что и в col_expr |
prod(numeric_expr) | bigint, hugeint или double |
sum(numeric_expr) | Зависит от типа numeric_expr |
corr(numeric_a, numeric_b) | double |
covar_pop(numeric_a, numeric_b) | double |
covar_samp(numeric_a, numeric_b) | double |
stddev_pop(numeric_expr) | double |
stddev_samp(numeric_expr) | double |
var_pop(numeric_expr) | double |
var_samp(numeric_expr) | double |
group_concat(col_expr clob) | clob |
group_concat(col_expr clob, separator clob) | clob |
listagg(col_expr varchar) | varchar |
listagg(col_expr varchar, separator varchar) | varchar |