Издание некоторых газет, журналов и даже книг может приносить выгоду (К. Прутков).

Функция LAG в MySQL

2 мин для чтения
FavoriteLoadingДобавить в избранное
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (3 оценок, среднее: 5,00 из 5)
Загрузка...
10 октября 2019
MySQL. Математические функции
Описание: в этой статье вы узнаете, как использовать функцию LAG() в MySQL для доступа к данным предыдущей строки из текущей строки в том же наборе результатов.

Функция LAG() является оконной функцией, которая позволяет вам посмотреть назад ряд строк и получить доступ к данным этой строки из текущей строки.

Следующий код иллюстрирует синтаксис функции LAG():

LAG(<expression>[,offset[, default_value]]) OVER (
PARTITION BY expr,...
ORDER BY expr [ASC|DESC],...
)

 

Выражение

Функция LAG() возвращает значение из expression из строки, которая предшествует текущую строку по offset количеству строк в пределах его раздела или результирующий набор.

 

Смещение

offset – это число строк назад от текущей строки, из которой нужно получить значение. offset должен быть равен нулю или должно быть положительным целым числом. Если offset равен нулю, то функция LAG() оценивает expression текущей строки. Если вы не укажете offset, то функция LAG() использует один по умолчанию.

 

Значение по умолчанию

Если предшествующей строки нет, функция LAG() возвращает default_value. Например, если смещение равно 2, возвращаемым значением для первой строки является default_value. Если вы опустите default_value, функция LAG() вернется NULL по умолчанию.

 

Предложение PARTITION BY

Предложение PARTITION BY разделяет строки в наборе результатов на разделы, к которым применяется функция LAG(). Если вы пропустите предложение PARTITION BY, функция LAG() будет рассматривать весь набор результатов как один раздел.

 

Предложение ORDER BY

Предложение ORDER BY определяет порядок строк в каждом разделе до применения функции LAG().

Функция LAG() полезна для вычисления разности между текущими и предыдущими строками.

 

Пример функции LAG() в MySQL

Мы будем использовать таблицы orders, orderDetails и productLines из образца базы данных для демонстрации.

Следующий оператор возвращает значение заказа для каждой линейки продуктов в конкретном году и в предыдущем году:

WITH productline_sales AS (
SELECT productline,
YEAR(orderDate) order_year,
ROUND(SUM(quantityOrdered * priceEach),0) order_value
FROM orders
INNER JOIN orderdetails USING (orderNumber)
INNER JOIN products USING (productCode)
GROUP BY productline, order_year
)
SELECT
productline,
order_year,
order_value,
LAG(order_value, 1) OVER (
PARTITION BY productLine
ORDER BY order_year
) prev_year_order_value
FROM
productline_sales;

 

В этом примере:

  • Во-первых, мы использовали общее табличное выражение для получения стоимости заказа каждого продукта за каждый год.
  • Затем мы разделили продукты, используя линейки продуктов, на разделы, отсортировали каждый раздел по году заказа и применили функцию LAG() к каждому отсортированному разделу, чтобы получить стоимость заказа каждого продукта в предыдущем году.

Обратите внимание, что мы использовали функцию ROUND() для округления значений порядка до нуля.

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Просмотров: 357

Если статья понравилась, то поделитесь ей в социальных сетях:

Читайте также

    Добавить комментарий

    Войти с помощью: 

    Ваш e-mail не будет опубликован. Обязательные поля помечены *

    Сообщить об опечатке

    Текст, который будет отправлен нашим редакторам:

    Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

    badge
    Обратный звонок 1
    Отправить
    galka

    Спасибо! Ваша заявка принята

    close
    galka

    Спасибо! Ваша заявка принята

    close