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()函数从当前行获取前一项。