MySQL LEAD 和 LAG 函数

17 Mar 2025 | 5 分钟阅读

LEAD 和 LAG 是 MySQL 中的窗口函数,用于访问分区内当前行中指定行的**前一行和后一行**的值。这些函数是一种非聚合函数。

MySQL 中的**窗口函数**用于对分区或窗口内的每一行执行操作或计算。这些函数产生的结果类似于使用聚合函数完成的计算。但是,与对整个表执行操作的聚合函数不同,窗口函数不会产生分组到单行中的结果。因此,每一行都保持其独特的身份。在窗口函数中,我们必须了解以下几点:

  • 执行函数评估的行称为**当前行**。
  • **窗口**是与当前行相关或函数对其进行操作的行集。

让我们详细了解这些函数。

MySQL LEAD 函数

此函数允许我们向前查看行或后续行,以从当前行获取/访问该行的值。它是一种非常有用的方法,用于计算同一输出中当前行和后续行之间的差异。

下面是 MySQL 中使用 LEAD 函数的通用**语法**

参数解释

LEAD 函数语法包含以下参数。

参数描述
表达式它是一个**列名**或任何内置函数,其值由函数返回。
offset它包含从当前行开始的后续行数。它应该是一个**正整数**值。如果为**零**,则函数评估当前行的结果。如果我们**省略**它,函数默认使用 1。
default_value当当前行没有后续行时,将返回此值。如果省略,函数将返回**空值**。
OVEROVER 它负责将行划分为组。如果它为**空**,则函数使用所有行执行操作。
PARTITION BY它将结果集中的行拆分为应用函数的区段。如果我们没有指定此子句,则所有行在结果集中都视为单行。
ORDER BY它在应用函数之前确定分区中行的顺序。

MySQL LEAD() 函数示例

在这里,我们将了解 LEAD 函数如何与 MySQL 表一起工作。首先,我们需要使用以下语句创建一个名为 **sales_table** 的表。

接下来,我们将使用 **INSERT** 语句向此表中添加记录,如下所示

我们可以使用 **SELECT 语句** 验证表中的记录。它将给出如下输出

MySQL LEAD and LAG Function

以下语句查找**每个员工的销售额和下一笔销售详情**

此示例首先按年份将结果集划分为分区,然后使用国家/地区列对每个分区进行排序。最后,我们对每个分区应用 LEAD() 函数以获取下一个销售详情。以下输出更清楚地解释了这一点

MySQL LEAD and LAG Function

在输出中,我们可以在每个分区中看到空值。当后续行跨越分区边界时,每个分区的最后一行中的下一个值始终变为 NULL。

MySQL LAG 函数

此函数允许我们查看有关前一行或先前行的信息,以从当前行获取/访问前一行的值。它是一种非常有用的方法,用于计算同一结果集中当前行和前一行之间的差异。

下面是 MySQL 中使用 LAG 函数的通用**语法**

参数解释

LAG 函数语法包含以下参数。

参数描述
表达式它是一个**列名**或任何内置函数。
offset它包含从当前行开始的前一行数。它应该为**零**或任何**正整数**值。如果为**零**,则函数评估当前行的结果。如果我们**省略**它,函数默认使用 1。
default_value当当前行没有前一行时,将返回此值。如果省略,函数将返回**空值**。

其他参数如 OVER、PARTITION BY、ORDER BY 子句的含义与 LEAD 函数相同。

MySQL LAG() 函数示例

在这里,我们将了解 LAG 函数如何与 MySQL 表一起工作。我们可以使用上面名为 **sales_table** 的表进行演示。

以下语句查找**每个员工的销售额和上一笔销售详情**

此示例首先按年份将结果集划分为分区,然后使用国家/地区列对每个分区进行排序。最后,我们对每个分区应用 LAG() 函数以获取上一笔销售详情。执行上述语句后,我们可以看到以下输出

MySQL LEAD and LAG Function

在输出中,我们可以在每个分区中看到 0.00 值。它表示表中不存在的行的值。如果我们没有提供默认值,它将变为 NULL。

注意:LEAD() 和 LAG() 函数是在 MySQL 8.0 版本中引入的。因此我们不能在以前的版本中使用它们。它们总是与 OVER() 子句一起使用。如果我们没有使用此子句,它将引发错误。


下一主题MySQL CTE