SQL滞后
SQL lag()函数允许您以特定的偏移量从当前行访问前一行。简而言之,lag()函数允许您从当前行访问前一行。通过指定偏移量值,可以从当前行访问前1、2、3等行。
它与lead()函数相反,lead()函数允许您访问后续行。
SQL滞后()
函数语法如下:
LAG(value_expression, offset [, default])
/ (
[PARTITION BY partition_expression]
ORDER BY sort_expression [ASC | DESC]
);
以下是支持的参数:
- value_expression—指定前一行的返回值。表达式必须求值为单个值。
- offset -指定从当前行向后访问的行数。
- default -如果偏移量在分区范围之外,则设置默认值。缺省情况下,该值为NULL。
- 分区方式-指定如何对数据进行分区。
- 排序-它为每个分区中的行设置排序格式。
示例数据设置
在深入研究lag()函数的工作原理之前,让我们先设置一个基本表以进行演示。
创建表
INT主键AUTO_INCREMENT;
product_name VARCHAR (255),
类别VARCHAR (255),
price DECIMAL(10,2),
量INT,
expiration_date日期,
条形码长整型数字
);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
值('厨师帽25cm',
“面包房”,
24.67,
57岁的
“2023-09-09”,
2854509564204);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
价值(“鹌鹑蛋罐头”、
“储藏室”,
17.99,
67年,
“2023-09-29”,
1708039594250);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
价值(“咖啡-蛋诺卡布奇诺”,
“面包房”,
92.53,
10,
“2023-09-22”,
8704051853058);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
价值('梨-多刺',
“面包房”,
65.29,
48,
“2023-08-23”,
5174927442238);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
价值(“意面-天使的头发”,
“储藏室”,
48.38,
59岁的
“2023-08-05”,
8008123704782);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
价值('Wine - Prosecco Valdobiaddene');
“生产”,
44.18,
3,
“2023-03-13”,
6470981735653);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
价值(“糕点-法式迷你什锦”,
“储藏室”,
36.73,
52,
“2023-05-29”,
5963886298051);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
价值('橙子罐头,普通话',
“生产”,
65.0,
1,
“2023-04-20”,
6131761721332);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
价值(“猪肩肉”、
“生产”,
55.55,
73年,
“2023-05-01”,
9343592107125);
插入
成
产品(product_name,
类别,
价格,
量,
expiration_date,
条形码)
value(“Dc Hikiage Hira Huba”,
“生产”,
56.29,
53岁,
“2023-04-14”,
3354910667072);
数据创建和设置完成后,让我们继续讨论几个示例。
例1:基本用法
在本例中,我们可以访问包含产品信息的“products”表。假设我们想要从当前行获取之前的条形码。
我们可以这样使用lag()函数:
选择
product_name,
价格,
延迟(条形码)超过(按类别划分)
命令
price asc) as previous_item
从
产品p;
给定的代码根据类别对数据进行分区。然后,它使用lag()函数获取分区中的前一个条形码。
结果输出如下:
例2:设置默认值
如果特定列中没有前一行(超出边界),则该函数将值设置为NULL,如前面的示例所示。
要为任何范围外访问设置默认值,可以这样做:
选择
product_name,
价格,
lag(barcode, 1, 'N/A') over(按类别划分
命令
price asc) as previous_item
从
产品p;
我们将默认值设置为“N/A”。这将取代任何超出边界的值,如输出所示:
例3:自定义偏移值
假设您希望从当前行访问前两行。我们可以通过将偏移值设置为2来做到这一点。
查询示例如下:
选择
product_name,
价格,
lag(barcode, 2, 'N/A') over(按类别划分
命令
price asc) as previous_item
从
产品p;
输出:
该查询返回每个分区中的前两行。
结论
在本教程中,我们学习了如何使用lag()函数从当前行获取前一项。