摘要:在本教程中,您将学习如何使用 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()
函数示例
我们将使用示例数据库中的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;
Code language: SQL (Structured Query Language) (sql)
这是输出:
在这个例子中:
- 首先,我们使用公共表表达式来获取每年每种产品的订单值。
- 然后,我们使用产品线将产品划分为分区,按订单年份对每个分区进行排序,并将
LAG()
函数应用于每个排序的分区,以获得每个产品上一年的订单值。
请注意,我们使用ROUND()
函数将订单值四舍五入到小数点后零位。
在本教程中,您学习了如何使用 MySQL LAG()
函数从当前行访问上一行的数据。
本教程有帮助吗?