VStamp

SQL Базовый №14. Смещение

SQL Оконные Функции: Смещение, Lead, Lag, First и Last Value на Практике

TutorialТоварищ Excel - Power Query, Power Pivot, Python1,785 viewsJan 26, 2024

Урок 14 базового курса SQL — изучаем функции смещения для работы с данными из других строк таблицы и вычисляем процентные изменения.

SQL
Оконные функции
Lead
Lag
First value
Last value
Смещение
Процентное изменение
Partition by
Order by
Rows between
Фрейм
Датасет usdcad
Power Query
Power Pivot

Blurb

В этом уроке подробно рассматриваются оконные функции SQL, позволяющие получать значения из других строк таблицы, а не только из текущей. Основные моменты:

  • Использование функций Lag и Lead для получения значений из предыдущих и последующих строк.
  • Вычисление процентного изменения цены закрытия относительно предыдущего дня.
  • Применение функций First value и Last value для получения первого и последнего значения в рамках фрейма или секции.
  • Разбор концепции фрейма и расширение его с помощью rows between unbounded preceding and unbounded following для корректного получения последнего значения.
  • Практические примеры с датасетом usdcad, включая группировку по годам и месяцам с помощью Partition by и extract.

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

Want the big picture?

Highlighted Clips

1.

Введение в функции смещения Lag и Lead

Объяснение, как функции Lag и Lead позволяют получить значения из предыдущих или последующих строк таблицы с примером на ценах закрытия.

2.

Вычисление процентного изменения цены закрытия

Использование функции Lag для получения предыдущего значения и вычисление процентного изменения между текущим и предыдущим значением.

3.

Функции First value и Last value: получение первого и последнего значения

Демонстрация работы функций First value и Last value, объяснение разницы между фреймом и секцией, примеры с датасетом и сортировкой по дате.

4.

Пояснение концепции фрейма и расширение с rows between

Подробный разбор, как работает фрейм в оконных функциях, и как с помощью rows between unbounded preceding and unbounded following получить последнее значение для всей секции.

Введение в тему смещения и оконных функций

В начале видео автор приветствует зрителей и объявляет, что это четырнадцатый урок базового курса по SQL, посвящённый теме смещения с использованием оконных функций. Основное внимание уделяется функциям LAG, LEAD, FIRST_VALUE и LAST_VALUE, которые позволяют получать значения из других строк таблицы, а не только из текущей.

"Функции смещения позволяют нам получить значения которые находятся не в текущей строчке, а в другой строчке, например на предыдущей строчке, на одну строчку выше, на одну ниже, на пять строчек выше и так далее."

Ключевые моменты:

  • Функции смещения позволяют обращаться к значениям в соседних строках.
  • Можно получить первое или последнее значение в выбранной партиции.
  • Для урока используется датасет usdcad с данными по валютной паре.

Автор напоминает, что все файлы и домашние задания доступны спонсорам канала.


Практическое знакомство с функцией LAG

Автор показывает, как использовать функцию LAG для получения значения из предыдущей строки. В качестве примера берётся столбец с ценой закрытия (Close).

"У этой функции два параметра: первый — это столбец, из которого мы хотим получить значение, в нашем случае это цена закрытия, дальше запятая и второй параметр — это сколько строк от текущей данное значение должно быть выше."

  • Функция LAG принимает два параметра: столбец и смещение (число строк вверх).
  • Внутри OVER обязательно указывается сортировка, чтобы гарантировать правильный порядок.
  • Пример: LAG(Close, 1) OVER (ORDER BY Date) — значение цены закрытия предыдущего дня.
  • Можно менять смещение, например, на 2 строки выше.

Использование функции LEAD для смещения вниз

Далее автор демонстрирует функцию LEAD, которая работает аналогично LAG, но смещается вниз по таблице.

"Давайте проверим как работает функция Lead... мы видим здесь 1.5123, перемещаемся вниз на одну строчку, смотрим столбец CL и видим здесь тоже 1.5123."

  • LEAD позволяет получить значение из следующей строки.
  • Аналогично LAG, принимает параметры: столбец и смещение вниз.
  • Пример: LEAD(Close, 1) OVER (ORDER BY Date) — значение цены закрытия следующего дня.

Расчёт процентного изменения с помощью LAG

Автор решает практическую задачу — вычислить процентное изменение цены закрытия по сравнению с предыдущим днём.

"Нам нужно получить значение CL предыдущего дня и найти процентное изменение... берём текущий CL, из него вычитаем предыдущий, делим на предыдущее значение."

  • Используется LAG для получения предыдущего значения.
  • Формула процентного изменения: (Close - PrevClose) / PrevClose.
  • Рекомендуется умножить результат на 100 и округлить до двух знаков для удобства восприятия.

Функции FIRST_VALUE и LAST_VALUE: получение первого и последнего значения

Автор переходит к функциям FIRST_VALUE и LAST_VALUE, которые возвращают первое и последнее значение в рамках окна (фрейма).

"First value и Last value работают с фреймом, а не с секцией... начало фрейма и секции всегда совпадают, поэтому для First value результат будет один и тот же."

  • FIRST_VALUE возвращает первое значение в окне.
  • Для корректной работы обязательно указывать сортировку в OVER.
  • Можно использовать PARTITION BY для группировки, например, по годам.
  • Пример: получение первого значения открытия (Open) для каждого года.

Разбиение по годам и месяцам с помощью PARTITION BY и EXTRACT

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

"Добавляем Partition by, используем функцию extract для получения года и месяца из даты."

  • Используется PARTITION BY EXTRACT(YEAR FROM Date), EXTRACT(MONTH FROM Date).
  • Это позволяет получить первое значение для каждого месяца отдельно.
  • Пример: вычисление разницы между текущим Close и первым Open дня месяца.

Работа с функцией LAST_VALUE и расширение фрейма

Автор объясняет, что функция LAST_VALUE по умолчанию возвращает последнее значение в текущем фрейме, который расширяется от начала до текущей строки, а не до конца секции.

"Фрейм в первой строчке равен первой строчке, во второй — двум, в третьей — трём и так далее... поэтому в первой ячейке мы не получаем последнее значение."

  • Фрейм расширяется от начала до текущей строки.
  • Чтобы получить последнее значение всего окна, нужно расширить фрейм с помощью ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.
  • Это позволяет охватить все строки партиции.

Применение ROWS BETWEEN для получения последнего значения

Автор показывает, как добавить в OVER конструкцию ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING, чтобы LAST_VALUE возвращала последнее значение всей партиции.

"Добавляем rows between unbounded preceding and unbounded following, и теперь получаем одно значение во всём столбце."

  • Эта команда расширяет окно на все строки партиции.
  • После этого LAST_VALUE возвращает именно последнее значение.
  • Пример: получение последнего значения Close для всего датасета или для каждого месяца.

Итоговое задание: вычисление разницы между Open и последним Close месяца

Автор решает задачу: из каждого значения Open вычесть последнее значение Close для соответствующего месяца и года.

"Нужно из Open вычесть Close последнего дня месяца года, для этого добавляем Partition by с годом и месяцем."

  • Используется PARTITION BY с годом и месяцем.
  • Вычисляется разница между текущим Open и последним Close месяца.
  • Результат рекомендуется округлить и умножить на 100 для удобства.

Заключение и анонс следующего урока

В конце видео автор подводит итоги:

"Сегодня мы изучали функции смещения: LAG и LEAD позволяют получить значения выше или ниже текущей строки, First_value и Last_value работают с фреймом и позволяют получить первое или последнее значение фрейма."

  • Функции LAG и LEAD — для смещения вверх и вниз.
  • FIRST_VALUE — легко получить первое значение секции.
  • LAST_VALUE требует расширения окна через ROWS BETWEEN для получения последнего значения секции.
  • В следующем уроке будет подробно рассмотрена команда ROWS BETWEEN и бегущие агрегаты, например, скользящее среднее и нарастающий итог.

Автор прощается и приглашает к новым встречам.


Этот урок даёт чёткое и практическое понимание работы с функциями смещения и оконными функциями в SQL, показывая, как получать значения из соседних строк и как работать с первым и последним значениями в рамках партиций.

Key Questions

Функции Lag и Lead позволяют получить значение из другой строки таблицы относительно текущей: Lag — из предыдущей строки, Lead — из следующей.

Have more questions?

Analyzing video...

This may take a few moments.

Background illustration light mode

Ready to dive in?