Обложка канала

LEFT JOIN

5709 @leftjoin

Канал Николая Валиотти об аналитике и визуализации данных, data science и BI

LEFT JOIN

4 года назад
Открыть в
Оконные и аналитические функции в 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