Функции SUM()
, COUNT()
, AVG()
в SQL используются для агрегации данных в столбцах таблицы. В оконных версиях, эти функции вычислят значения в пределах указанного окна, группы.
Например, обычный подсчет среднего и суммы по регионам будет выглядеть так:
SELECT
sh.region,
SUM(s.price * s.quantity) AS sum_value,
AVG(s.price * s.quantity) AS avg_value
FROM sales AS s
LEFT JOIN customer AS c ON s.customer_id = c.customer_id
LEFT JOIN shop AS sh ON s.shop_id = sh.shop_id
GROUP BY sh.region;
region | sum_value | avg_value |
---|---|---|
Moscow | 106 | 2.8648648648648649 |
Vladivostok | 19 | 3.1666666666666667 |
Saint-Petersburg | 75 | 3.2608695652173913 |
Kaliningrad | 36 | 3.6000000000000000 |
Tver | 28 | 4.0000000000000000 |
Novosibirsk | 53 | 3.1176470588235294 |
View on DB Fiddle
Проблема запроса выше, что мы не можем сравнить значение строки с расчитанным средним или суммой. В таком случае, нам помогут оконные функции:
SELECT
id,
sale_date,
price,
quantity,
(price * quantity) as value,
region,
c.category,
SUM(s.price * s.quantity) OVER (PARTITION BY region) AS sum_value,
AVG(s.price * s.quantity) OVER (PARTITION BY region) AS avg_value
FROM sales AS s
LEFT JOIN customer AS c ON s.customer_id = c.customer_id
LEFT JOIN shop AS sh ON s.shop_id = sh.shop_id
ORDER BY s.id;
id | sale_date | price | quantity | value | region | category | sum_value | avg_value |
---|---|---|---|---|---|---|---|---|
1 | 2023-01-01 | 4 | 1 | 4 | Moscow | with discount cards | 106 | 2.8648648648648649 |
2 | 2023-01-01 | 2 | 2 | 4 | Moscow | with discount cards | 106 | 2.8648648648648649 |
7 | 2023-01-03 | 1 | 1 | 1 | Saint-Petersburg | without discount card | 75 | 3.2608695652173913 |
8 | 2023-01-03 | 3 | 1 | 3 | Kaliningrad | with discount cards | 36 | 3.6000000000000000 |
... |
View on DB Fiddle
Агрегирующие функции вычисляют значения для окон, указанных в OVER (PARTITION BY region)
. Теперь рядом с каждой строкой таблицы мы также получим вычисленное значение по группе, в которой есть эта строка. Эти данные позволяют нам провести анализ, например была ли сумма продажи выше или ниже среднего чека по региону.
Выводы
- Оконные функции позволяют выполнять агрегатные вычисления не только по всей таблице, но и в пределах определенного окна, что делает их мощным инструментом для аналитики данных
- При использовании оконной функции версии функции каждая строка будет иметь доступ к количеству строк в заданном окне.
- Для использования оконных функций
SUM()
,COUNT()
,AVG()
в SQL необходимо указатьOVER()
сPARTITION BY
для определения окна, в пределах которого будет выполняться вычисление функции.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.