Основы баз данных и SQL. Аналитические функции v2.0 презентация

Содержание

Слайд 2

Содержание
Что это, зачем и как работает
Примеры
Аналоги агрегатных. Ограничения окна

10.06.2019

GlowByte Consulting

Слайд 3

Знакомьтесь – модельная таблица

История операций по банковским счетам

10.06.2019

GlowByte Consulting

Слайд 4

Общий синтаксис

10.06.2019

GlowByte Consulting

функция(аргументы) OVER (параметры окна)

Видите слово OVER – значит, перед вами аналитическая

функция. Еще их называют оконными.

Слайд 5

Зачем нужны аналитические функции?

Вычислить значение, которое зависит от порядка строк*

10.06.2019

GlowByte Consulting

SELECT
H.*,
--

нумерует начисления на счет
ROW_NUMBER() OVER (
PARTITION BY ACC_ID ORDER BY DT
) RN
FROM ACC_HIST H;

* Исходно же в реляционной модели у строк нет порядка, вычисления по ним проводятся независимо

Слайд 6

Зачем еще нужны?

Вычислить метрику* и не схлопывать группу строк в одну

10.06.2019

GlowByte Consulting

SELECT
H.*,

-- суммарные начисления на счет
SUM(VALUE) OVER (
PARTITION BY ACC_ID
) SUM_V
FROM ACC_HIST H
ORDER BY ACC_ID, DT;

* Подробно см. далее про аналоги агрегатных функций

Слайд 7

Еще типичные задачи на оконные функции

Посчитать промежуточную сумму
Посчитать процент ЗП сотрудника от общей

ЗП по отделу
Запросить первых top N сотрудников по ЗП
Посчитать скользящие метрики
Отранжировать сотрудников по ЗП

10.06.2019

GlowByte Consulting

См. книгу – Томас Кайт «Oracle для профессионалов», глава 12

Слайд 8

Аналитические vs Однострочные

Что общего: не меняют детализацию выборки, просто добавляют к ней столбец.
В

чем разница: однострочные считаются независимо для каждой строки.
Аналитические учитывают порядок строк/разбивку по группам.

10.06.2019

GlowByte Consulting

Слайд 9

Аналитические vs Агрегатные

Что общего: при вычислении обращаются к набору строк.
В чем разница: агрегатные

схлопывают группу строк в одну.
Аналитические не меняют количество строк выборки.

10.06.2019

GlowByte Consulting

Слайд 10

Еще про синтаксис – параметры окна

PARTITION BY – разбивает строки на группы.
ORDER BY

– задает порядок строк.

10.06.2019

GlowByte Consulting

SELECT
H.*,
-- нумерует начисления на счет
ROW_NUMBER() OVER (
PARTITION BY ACC_ID ORDER BY DT
) RN
FROM ACC_HIST H;

Слайд 11

Важно!

Аналитические функции вычисляются
только в SELECT или ORDER BY.
Хочешь поставить в WHERE? Делай подзапрос.

10.06.2019

GlowByte

Consulting

Слайд 12

Фильтруем по аналитической функции

Найдем последний платеж по каждому счету.
Это популярное применение ROW_NUMBER.

10.06.2019

GlowByte Consulting

SELECT

ACC_ID, VALUE, DT
FROM (
SELECT
ACC_ID, VALUE, DT,
ROW_NUMBER() OVER (
PARTITION BY ACC_ID
ORDER BY DT DESC
) RN
FROM ACC_HIST
) H
WHERE RN = 1;

Слайд 13

С ROW_NUMBER понятно. Какие еще бывают?

10.06.2019

GlowByte Consulting

Слайд 14

Ранжирование – RANK, DENSE_RANK

Ранжируют строки по полю, по которому сортируем

10.06.2019

GlowByte Consulting

SELECT
H.*,
RANK()

OVER (ORDER BY VALUE) R,
DENSE_RANK() OVER (ORDER BY VALUE) DR
FROM ACC_HIST H;

Слайд 15

RANK и DENSE_RANK – пример

Топ 3 снятий со счета

10.06.2019

GlowByte Consulting

SELECT ACC_ID, VALUE, DT
FROM

(
SELECT
ACC_ID, VALUE, DT,
RANK() OVER (ORDER BY VALUE) R
FROM ACC_HIST
) H
WHERE R <= 3;

Т.е. учитываем, что некоторые снятия могут совпадать.
Еще можно вычислять места участников состязаний по их результатам.

Слайд 16

FIRST_VALUE – первое значение столбца

10.06.2019

GlowByte Consulting

SELECT
ACC_ID, VALUE, DT,
FIRST_VALUE(VALUE) OVER (
PARTITION

BY ACC_ID ORDER BY DT
) FIRST_VAL
FROM ACC_HIST;

Слайд 17

LAG и LEAD – идем в соседние строки

Найдем величину предыдущей и следующей операции

по счету

10.06.2019

GlowByte Consulting

SELECT
ACC_ID, VALUE, DT,
LAG(VALUE) OVER (
PARTITION BY ACC_ID ORDER BY DT
) PREV_VAL,
LEAD(VALUE) OVER (
PARTITION BY ACC_ID ORDER BY DT
) NEXT_VAL
FROM ACC_HIST;

Слайд 18

Аналоги агрегатных функций

10.06.2019

GlowByte Consulting

Слайд 19

Аналоги агрегатных функций

Пишем к агрегатной функции OVER (…) – получаем оконную.
Только не меняем

детализацию выборки.

10.06.2019

GlowByte Consulting

SELECT
H.*,
-- суммарные начисления на счет
SUM(VALUE) OVER (
PARTITION BY ACC_ID
) SUM_V
FROM ACC_HIST H
ORDER BY ACC_ID, DT;

Слайд 20

А если добавим ORDER BY?

Получим скользящую метрику:

10.06.2019

GlowByte Consulting

SELECT
H.*,
-- денег на счету

после операции
SUM(VALUE) OVER (
PARTITION BY ACC_ID
ORDER BY DT
) SUM_V
FROM ACC_HIST H
ORDER BY ACC_ID, DT;

* У операций одинаковая дата. Очередность неизвестна.
Считается, что они произошли одновременно.

Слайд 21

Ограничиваем окно строк

10.06.2019

GlowByte Consulting

Слайд 22

Ограничиваем окно – ROWS

10.06.2019

GlowByte Consulting

Сумма по 2 последним платежам:

SELECT
H.*,
SUM(VALUE) OVER (

PARTITION BY ACC_ID
ORDER BY DT
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
) SUM_V
FROM ACC_HIST H
ORDER BY ACC_ID, DT;

* Платежи были одновременные –
результат запроса может быть неоднозначен!

Слайд 24

Ограничиваем окно – RANGE

Сумма платежей за последние 2 дня:

10.06.2019

GlowByte Consulting

SELECT
H.*,
SUM(VALUE) OVER

(
PARTITION BY ACC_ID
ORDER BY DT
RANGE BETWEEN 1 PRECEDING AND CURRENT ROW
) SUM_V
FROM ACC_HIST H
ORDER BY ACC_ID, DT;

Слайд 25

RANGE – особенности

Между чем и чем считает – синтаксис, как у ROWS.
В SQL

Server не работает с N PRECEDING/FOLLOWING. В Oracle работает.
Тип данных поля, по которому сортируем – число или дата-время.

10.06.2019

GlowByte Consulting

Слайд 26

! Не всегда детерминирован результат

10.06.2019

GlowByte Consulting

Запускаем запрос 2 раза – получаем разный результат.
Потому

что есть 2 одновременных платежа.

SELECT H.*, ROW_NUMBER() OVER (PARTITION BY ACC_ID ORDER BY DT) RN
FROM ACC_HIST H
WHERE ACC_ID = 3;

Запуск 1:

Запуск 2:

Слайд 27

Задачи на дом – см. на вики «Основы баз данных и SQL»

10.06.2019

GlowByte Consulting

Имя файла: Основы-баз-данных-и-SQL.-Аналитические-функции-v2.0.pptx
Количество просмотров: 70
Количество скачиваний: 0