Similar presentations:
Оконные функции SQL
1.
Курс «Хранилища данных»Тема: Оконные функции SQL
Барабанщиков
Игорь Витальевич
2.
Оконные функции• Ранжирующие функции полезны при сравнении
элементов для фиксированного окна времени.
• Оконные функции позволяют вычислить
обобщающие значения для окна, которое
изменяется по мере продвижения данных.
• Окно обобщения можно определить, указав:
- набор строк «от текущей строки до конца
раздела»
- временной интервал «за 30 дней,
предшествующих дате транзакции»
- диапазон значений
2
3.
Окно• Оконная функция применяется к набору строк.
• Окно – стандартный термин SQL, служащий для
описания контекста, в котором работает
функция.
• Для указания окна используется предложение
OVER.
• Предложение OVER определяет окно или
точный набор строк по отношению к текущей
строке, указание об упорядоченности (если
нужно), другие элементы.
• Упорядочение необходимо для ранжирования
строк.
3
4.
Скользящее окно• Скользящее окно – это набор данных, границы
которого изменяются с течением времени.
4
5.
Границы скользящего окна• Задаются фразой
ROWS BETWEEN нижняя гр AND верхняя гр
• Границы окна:
- PRECEDING: предшествующий (нижняя
граница)
- FOLLOWING: следующий (верхняя граница)
• Значения границ окна:
- UNBOUNDED: не ограничено
- CURRENT ROW: текущая строка
- ЧИСЛО: конкретное значение
5
6.
ПримерMonth
SELECT month, SUM(sales)
FROM orders
WHERE year = 2015
AND region_id = 5
GROUP BY month
ORDER BY month
SUM(sales)
1
100
2
50
3
100
4
100
5
200
6
200
7
100
8
100
9
250
10
100
11
100
12
1006
7.
Неограниченное окноSELECT month, SUM(sales) monthly_sales,
SUM(SUM(sales)) OVER (ORDER BY month
ROWS BETWEEN UNBOUNDED PRECEDING
and UNBOUNDED FOLLOWING) total_sales
FROM orders
WHERE year = 2015
AND region_id = 5
GROUP BY month
ORDER BY month
7
8.
Результат запросаMonth
Monthly_Sales
Total_Sales
1
100
1500
2
50
1500
3
100
1500
4
100
1500
5
200
1500
6
200
1500
7
100
1500
8
100
1500
9
250
1500
10
100
1500
11
100
1500
12
100
1500
8
9.
Нарастающий итогSELECT month, SUM(sales) monthly_sales,
SUM(SUM(sales)) OVER (ORDER BY month
ROWS BETWEEN UNBOUNDED PRECEDING
and CURRENT ROW) total_sales
FROM orders
WHERE year = 2015
AND region_id = 5
GROUP BY month
ORDER BY month
9
10.
Результат запросаMonth
Monthly_Sales
Total_Sales
1
100
100
2
50
150
3
100
250
4
100
350
5
200
550
6
200
750
7
100
850
8
100
950
9
250
1200
10
100
1300
11
100
1400
12
100
1500
10
11.
Скользящее окноСредний объем продаж за текущий,
предыдущий и следующий месяцы:
SELECT month, SUM(sales) monthly_sales,
AVG(SUM(sales)) OVER (ORDER BY month
ROWS BETWEEN 1 PRECEDING
and 1 FOLLOWING) rolling_avg
FROM orders
WHERE year = 2015
AND region_id = 5
GROUP BY month
ORDER BY month
11
12.
Результат запросаMonth
Monthly_Sales
Rolling_Avg
1
100
75
2
50
83.33
3
100
83.33
4
100
133.33
5
200
166.66
6
200
166.66
7
100
133.33
8
100
150
9
250
150
10
100
150
11
100
100
12
100
100
12
13.
Функции LAG / LEAD• Позволяют ссылаться на строки по их
позиции относительно текущей строки,
подобно инструкциям PRECEDING и
FOLLOWING.
• Удобны при сравнении одной строки
результирующего множества с другой
строкой того же результирующего множества.
• Пример: Вычислить общий объем продаж по
месяцам для региона Урал, включив процент
изменения по отношению к предыдущему
месяцу.
13
14.
Пример использования LAGSELECT month, SUM(sales) monthly_sales,
LAG(SUM(sales)), 1) OVER (ORDER BY month)
prev_month_sales
FROM orders
WHERE year = 2015
AND region_id = 5
GROUP BY month
ORDER BY month
14
15.
Результат запроса c LAGMonth
Monthly_Sales
Prev_Month_Sales
1
100
2
50
100
3
100
50
4
100
100
5
200
100
6
200
200
7
100
200
8
100
100
9
250
100
10
100
250
11
100
100
12
100
100
15
16.
Функции для создания отчетов• Подобно оконным функциям, позволяют
выполнить различные обобщающие операции
(MIN, MAX, SUM, COUNT, AVG) над
результирующим множеством.
• В отличие от оконных функций, не могут
указывать локальные окна и поэтому выводят
результат для всего раздела.
• Все то, что можно сделать с помощью функции
для создания отчета, можно сделать и с помощью
оконной функции, только первый вариант обычно
будет более эффективным.
16
17.
ПримерMonth
SELECT month,
SUM(sales) monthly_sales,
SUM(SUM(sales)) OVER()
yearly_sales
FROM orders
WHERE year = 2015
AND region_id = 5
GROUP BY month
ORDER BY month
Monthly_
Sales
Yearly_
Sales
1
100
1500
2
100
1500
3
200
1500
4
100
1500
5
100
1500
6
150
1500
7
150
1500
8
100
1500
9
100
1500
10
100
1500
11
100
1500
12
200
1500
17
18.
Разбиение отчетов• Как и ранжирующие отчеты, функции для
создания отчетов могут содержать инструкцию
PARTITION BY для разбиения результирующего
множества на несколько частей.
• Это позволяет выполнить несколько
суммирований для различных подмножеств
результирующего множества.
• Пример: Вывести общий объем продаж для
каждого продавца по регионам, а также общий
объем продаж региона (для сравнения).
18
19.
ЗапросSELECT region_id, salesman_id
SUM(sales) AS sm_sales,
SUM(SUM(sales)) OVER (PARTITION BY
region_id) AS region_sales
FROM orders
WHERE year = 2016
GROUP BY region_id, salesman_id
ORDER BY region_id, salesman_id
19
20.
Результат запросаRegion_ID
SalesMan_ID
SM_sales
Region_Sales
1
1
100
600
1
2
200
600
1
3
300
600
2
4
150
750
2
5
250
750
2
6
200
750
2
7
150
750
3
8
50
350
3
9
75
350
3
10
125
350
3
11
100
350
20
21.
Заключение• Для решения задач
бизнес-аналитики
приходится писать
сложные SQL-запросы.
• Оконные функции
позволяют вычислить
обобщающие
значения для окна,
которое изменяется по
мере продвижения
данных.
21