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