MySQL LAG Function

摘要:在本教程中,您将学习如何使用 MySQL LAG()函数从同一结果集中的当前行访问前一行的数据。

LAG()函数是一个窗口函数,允许您回顾多行并从当前行访问该行的数据。

下面说明了LAG()函数的语法:

LAG(<expression>[,offset[, default_value]]) OVER (
    PARTITION BY expr,...
    ORDER BY expr [ASC|DESC],...
)
Code language: SQL (Structured Query Language) (sql)

表达

LAG()函数从当前行之前的行返回expression的值, offset量是其分区或结果集中的行数。

抵消

offset是从当前行返回的行数(从中获取值)。 offset必须为零或字面量正整数。如果offset为零,则LAG()函数计算当前行的expression 。如果您不指定offset ,则LAG()函数默认使用 1。

默认值

如果没有前一行,则LAG()函数返回default_value 。例如,如果 offset 为 2,则第一行的返回值为default_value 。如果省略default_value ,则LAG()函数默认返回NULL

PARTITION BY子句

PARTITION BY子句将结果集中的行划分为应用LAG()函数的分区。如果省略PARTITION BY子句, LAG()函数会将整个结果集视为单个分区。

ORDER BY子句

ORDER BY子句指定应用LAG()函数之前每个分区中的行顺序。

LAG()函数对于计算当前行和前一行之间的差异非常有用。

MySQL LAG()函数示例

我们将使用示例数据库中的ordersorderDetailsproductLines表进行演示。

以下语句返回特定年份和上一年每个产品线的订单值:

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;
Code language: SQL (Structured Query Language) (sql)

这是输出:

MySQL LAG function - current and previous year example

在这个例子中:

  • 首先,我们使用公共表表达式来获取每年每种产品的订单值。
  • 然后,我们使用产品线将产品划分为分区,按订单年份对每个分区进行排序,并将LAG()函数应用于每个排序的分区,以获得每个产品上一年的订单值。

请注意,我们使用ROUND()函数将订单值四舍五入到小数点后零位。

在本教程中,您学习了如何使用 MySQL LAG()函数从当前行访问上一行的数据。

本教程有帮助吗?