MySQL LAG() 函数
简介:在本教程中,您将学习如何使用MySQL
LAG()
函数从同一结果集中的当前行访问上一行的数据。
LAG()
函数是一个窗口函数,允许您回顾多行并从当前行访问行的数据。
以下说明了LAG()
函数的语法:
LAG(<expression>[,offset[, default_value]]) OVER ( PARTITION BY expr,... ORDER BY expr [ASC|DESC],... )
expression
LAG()
函数返回expression
当前行之前的行的值,其值为offset
其分区或结果集中的行数。
offset
offset
是从当前行返回的行数,以获取值。offset
必须是零或文字正整数。如果offset
为零,则LAG()
函数计算expression
当前行的值。如果未指定offset
,则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() 函数示例
我们将使用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;这是输出:
+------------------+------------+-------------+-----------------------+ | productline | order_year | order_value | prev_year_order_value | +------------------+------------+-------------+-----------------------+ | Classic Cars | 2013 | 1374832 | NULL | | Classic Cars | 2014 | 1763137 | 1374832 | | Classic Cars | 2015 | 715954 | 1763137 | | Motorcycles | 2013 | 348909 | NULL | | Motorcycles | 2014 | 527244 | 348909 | | Motorcycles | 2015 | 245273 | 527244 | | Planes | 2013 | 309784 | NULL | | Planes | 2014 | 471971 | 309784 | | Planes | 2015 | 172882 | 471971 | | Ships | 2013 | 222182 | NULL | | Ships | 2014 | 337326 | 222182 | | Ships | 2015 | 104490 | 337326 | | Trains | 2013 | 65822 | NULL | | Trains | 2014 | 96286 | 65822 | | Trains | 2015 | 26425 | 96286 | | Trucks and Buses | 2013 | 376657 | NULL | | Trucks and Buses | 2014 | 465390 | 376657 | | Trucks and Buses | 2015 | 182066 | 465390 | | Vintage Cars | 2013 | 619161 | NULL | | Vintage Cars | 2014 | 854552 | 619161 | | Vintage Cars | 2015 | 323846 | 854552 | +------------------+------------+-------------+-----------------------+ 21 rows in set (0.04 sec)在这个例子中:
- 首先,我们使用公用表表达式来获取每年每个产品的订单价值。
- 然后,我们使用产品线将产品划分为分区,按订单年度对每个分区进行分类,并将
LAG()
函数应用于每个已排序的分区以获取每个产品的上一年的订单值。
注意:我们使用
在本教程中,您学习了如何使用MySQL ROUND()
函数将订单值舍入到零小数位。
LAG()
函数访问当前行中前一行的数据。