Оконные и аналитические функции в SQL: Начало
Врываемся с серией постов про оконные функции в SQL. Оконные функции — это классная опция в некоторых движках баз данных, которая с легкостью помогает решать ряд аналитических задач без написания сложных SQL-конструкций.
Разберемся подробнее
Когда мы пишем запрос для получения агрегатов, то строки обрабатываются «единым куском», для которого вычисляется агрегат.
А при использовании оконных функций, запрос делится на “окна” и уже для каждой из отдельных частей считаются нужные агрегаты. Важно помнить: движок посчитает в рамках окна только те агрегаты, которые используют оконное выражение, а не все подряд в запросе.
Окно определяется с помощью обязательной инструкции OVER():
SELECT функция (столбец для вычислений)
OVER (
[PARTITION BY столбец для формирования окна]
[ORDER BY столбец для сортировки]
[ROWS или RANGE выражение для ограничения строк в пределах группы]
)
Для лучшего понимания работы оконных функций стоит вспомнить о порядке выполнения запроса: так как оконные функции выполняются в блоке SELECT, то все вычисления в них происходят после возможной фильтрации и/или группировки. То есть, если в таблице с домашними животными указать WHERE animal = ‘cat’, то оконные функции будут оперировать только котиками, а попугаи и пёсики в их расчёты не попадут.
Интересная особенность
Можно не использовать опциональные конструкции и получить аналогичный обыкновенной агрегации результат.
Сравните:
SELECT SUM(amount) OVER() AS total_amount
FROM A
VS
SELECT SUM(amount) AS total_amount
FROM A
Оба запроса выдадут один и тот же результат. Но в первом случае мы можем дополнительно сразу выбрать другие поля, не участвующие в агрегации, в то время как второй вариант (классическая агрегация) такого не допускает.
Итак, в квадратных скобках обозначены необязательные параметры. Однако, вся суть в том, чтобы указать их для получения иного, разбитого по “окнам” результата.
Поговорим про них отдельно?
#leftjoin_sql