MySQL LAG函数

时间:2019-11-20 08:52:27  来源:igfitidea点击:

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

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

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

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

expression

LAG()函数从当前行之前的行返回其分区或结果集中行的偏移数量的表达式的值。

offset

偏移量offset是从当前行返回值的行数。
偏移量必须为零或文字正整数。
如果offset为零,则LAG()函数将计算当前行的表达式。
如果您未指定偏移量,则LAG()函数默认使用一个。

default_value 默认值

如果没有前一行,则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()函数示例

我们将使用示例数据库中的order,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()函数将订单值四舍五入到小数点后零位。

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