Оконные функции#
Оконные функции выполняют вычисления по строкам результата запроса.
Они выполняются после предложения HAVING, но до предложения ORDER BY.
Вызов оконной функции требует специального синтаксиса с использованием
предложения OVER для задания окна.
Например, следующий запрос ранжирует заказы каждого клерка по цене:
SELECT orderkey, clerk, totalprice,
rank() OVER (PARTITION BY clerk
ORDER BY totalprice DESC) AS rnk
FROM orders
ORDER BY clerk, rnk
Окно можно задать двумя способами (см. Предложение WINDOW):
Ссылкой на именованную спецификацию окна, определенную в предложении
WINDOW,Встроенной спецификацией окна, которая позволяет определить компоненты окна, а также ссылаться на компоненты окна, заранее определенные в предложении
WINDOW.
Агрегатные функции#
Все Агрегатные функции можно использовать как оконные функции, добавив
предложение OVER. Агрегатная функция вычисляется для каждой строки по строкам
в пределах оконного фрейма текущей строки. Обратите внимание, что ordering during
aggregation не поддерживается.
Например, следующий запрос формирует скользящую сумму цен заказов по дням для каждого клерка:
SELECT clerk, orderdate, orderkey, totalprice,
sum(totalprice) OVER (PARTITION BY clerk
ORDER BY orderdate) AS rolling_sum
FROM orders
ORDER BY clerk, orderdate, orderkey
Функции ранжирования#
- cume_dist() bigint#
Возвращает кумулятивное распределение значения в группе значений. Результат — это количество строк, предшествующих текущей строке или равных ей, в порядке окна раздела окна, деленное на общее число строк в разделе окна. Таким образом, одинаковые значения в порядке будут иметь одно и то же значение распределения. Оконный фрейм не должен быть задан.
- dense_rank() bigint#
Возвращает ранг значения в группе значений. Это похоже на
rank(), за исключением того, что равные значения не создают пропусков в последовательности. Оконный фрейм не должен быть задан.
- ntile(n) bigint#
Разделяет строки каждого раздела окна на
nкорзин с номерами от1до максимумn. Значения корзин отличаются не более чем на1. Если количество строк в разделе не делится нацело на количество корзин, остаток распределяется по одному значению на корзину, начиная с первой корзины.Например, для
6строк и4корзин значения корзин будут следующими:112234Для функции
ntile()оконный фрейм не должен быть задан.
- percent_rank() double#
Возвращает процентный ранг значения в группе значений. Результат вычисляется как
(r - 1) / (n - 1), гдеr—rank()строки, аn— общее количество строк в разделе окна. Оконный фрейм не должен быть задан.
- rank() bigint#
Возвращает ранг значения в группе значений. Ранг — это единица плюс количество строк, предшествующих текущей строке и не равных ей. Таким образом, равные значения в порядке создают пропуски в последовательности. Ранжирование выполняется для каждого раздела окна. Оконный фрейм не должен быть задан.
- row_number() bigint#
Возвращает уникальный последовательный номер для каждой строки, начиная с единицы, в соответствии с порядком строк в пределах раздела окна. Оконный фрейм не должен быть задан.
Функции значений#
По умолчанию значения null учитываются. Если указан IGNORE NULLS, все строки, где
x равно null, исключаются из вычисления. Если указан IGNORE NULLS, и x
равно null для всех строк, возвращается default_value, а если оно не задано,
возвращается null.
- first_value(x) [same as input]#
Возвращает первое значение окна.
- last_value(x) [same as input]#
Возвращает последнее значение окна.
- nth_value(x, offset) [same as input]#
Возвращает значение по указанному смещению от начала окна. Смещения начинаются с
1. Смещение может быть любым скалярным выражением. Если смещение равно null или больше количества значений в окне, возвращаетсяnull. Ошибкой является смещение, равное нулю или отрицательное.
- lead(x[, offset[, default_value]]) [same as input]#
Возвращает значение на
offsetстрок после текущей строки в разделе окна. Смещения начинаются с0, что соответствует текущей строке. Смещение может быть любым скалярным выражением. Значениеoffsetпо умолчанию —1. Если смещение равно null, возникает ошибка. Если смещение указывает на строку вне раздела, возвращаетсяdefault_value, а если оно не задано, возвращаетсяnull. Функцияlead()требует, чтобы был задан порядок окна. Оконный фрейм не должен быть задан.
- lag(x[, offset[, default_value]]) [same as input]#
Возвращает значение на
offsetстрок до текущей строки в разделе окна. Смещения начинаются с0, что соответствует текущей строке. Смещение может быть любым скалярным выражением. Значениеoffsetпо умолчанию —1. Если смещение равно null, возникает ошибка. Если смещение указывает на строку вне раздела, возвращаетсяdefault_value, а если оно не задано, возвращаетсяnull. Функцияlag()требует, чтобы был задан порядок окна. Оконный фрейм не должен быть задан.