Описание: в этой статье вы узнаете, как использовать функцию 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 разделяет строки в наборе результатов на разделы, к которым применяется функция LAG(). Если вы пропустите предложение PARTITION BY, функция LAG() будет рассматривать весь набор результатов как один раздел.
Предложение ORDER BY определяет порядок строк в каждом разделе до применения функции LAG().
Функция LAG() полезна для вычисления разности между текущими и предыдущими строками.
Мы будем использовать таблицы 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;
В этом примере:
Обратите внимание, что мы использовали функцию ROUND() для округления значений порядка до нуля.
В этой статье вы узнали, как использовать функцию LAG() в MySQL для доступа к данным предыдущей строки из текущей строки.