2024年10月20日 MySQL LEAD 和 LAG 函数 极客笔记
LEAD 和 LAG 是 MySQL 中的窗口函数,用于获取当前行所在分区内指定行的前一行和后一行的值。这些函数属于非聚合函数。
窗口函数 在MySQL中用于在分区或窗口内对每一行进行操作或计算。这些函数产生的结果类似于使用聚合函数进行的计算。但是,与在整个表上执行操作的聚合函数不同,窗口函数不产生一个结果被分组到单行中。因此每一行都保持着唯一的标识。在窗口函数中,我们必须了解以下几点:
让我们详细了解这些函数。
这个函数允许我们向前查看行或后续行,以从当前行获取/访问该行的值。它是一种非常有用的方法,用于计算相同输出中当前行与后续行之间的差异。
以下是在 MySQL 中使用 LEAD 函数的一般 语法 :
LEAD(expression, offset , default_value) OVER (
PARTITION BY (expr)
ORDER BY (expr)
)
LEAD函数的语法包含以下参数。
参数 | 描述 |
---|---|
expression | 它是一个 列名 或任何内置函数,函数返回该函数的值。 |
offset | 它包含从当前行开始的行数。它应该是一个 正整数 值。如果它是 零 ,函数计算当前行的结果。如果我们 省略 它,函数默认使用1。 |
default_value | 当当前行没有后续行时,它是一个返回的值。如果我们省略这个值,函数返回 null值 。 |
OVER | OVER负责将行分组。如果它 为空 ,函数在使用所有行执行操作。 |
PARTITION BY | 它将结果集中的行分割成被应用函数的分区。如果我们没有指定这个子句,所有的行都被视为结果集中的一行。 |
ORDER BY | 在应用函数之前,它确定分区中行的顺序。 |
这里,我们将了解LEAD函数在MySQL表中的工作原理。首先,我们需要使用以下语句创建一个名为 sales_table 的表。
CREATE TABLE sales_table (
Employee_Name VARCHAR(45) NOT NULL,
Year INT NOT NULL,
Country VARCHAR(45) NOT NULL,
Product VARCHAR(45) NOT NULL,
Sale DECIMAL(12,2) NOT NULL,
PRIMARY KEY(Employee_Name, Year)
);
接下来,我们将使用 INSERT 语句向这个表中添加记录,具体操作如下:
INSERT INTO sales_table VALUES
('Stephen', 2017, 'India', 'Laptop', 10000),
('Stephen', 2018, 'India', 'Laptop', 15000),
('Stephen', 2019, 'India', 'TV', 20000),
('Bob', 2017, 'US', 'Computer', 15000),
('Bob', 2018, 'US', 'Computer', 10000),
('Bob', 2019, 'US', 'TV', 20000),
('Mandy', 2017, 'Canada', 'Mobile', 20000),
('Mandy', 2018, 'Canada', 'Calculator', 1500),
('Mandy', 2019, 'Canada', 'Mobile', 25000);
我们可以使用 SELECT语句将记录验证到表中。它将输出如下:
以下语句查找每个员工的销售和下一个销售详情:
SELECT Year, Product, Sale,
LEAD(Sale,1) OVER (
PARTITION BY Year
ORDER BY Country) AS Next_Sale
FROM sales_table;
本示例首先将结果集按年份分成分区,然后使用国家列对每个分区进行排序。最后,我们对每个分区应用LEAD()函数以获取下一个销售详细信息。下面的输出更清楚地解释了这一点:
在输出中,我们可以看到每个分区中的空值。当下一行越过分区边界时,每个分区的最后一行的下一个值总是变为NULL。
这个函数允许我们查看关于向后行或前面行的信息,并从当前行中获取/访问上一行的值。这是一种非常有用的方法,用于计算相同结果集内当前行与上一行之间的差异。
下面是在MySQL中使用LAG函数的通用语法:
LAG (expression, offset , default_value) OVER (
PARTITION BY (expr)
ORDER BY (expr [ASC|DESC])
)
LAG函数的语法包含以下参数。
参数 | 描述 |
---|---|
expression | 它是一个 列名 或任何内置函数。 |
offset | 它包含当前行之前的行数。它应该是 零 或任何 正整数 值。如果 省略 这个参数,函数将默认使用1。 |
default_value | 当前行之前没有行时,它是一个返回值。如果忽略此参数,函数将返回 null值 。 |
其他参数,如OVER、PARTITION BY、ORDER BY子句的含义与LEAD函数相同。
在这里,我们将了解LAG函数如何与MySQL表一起使用。我们可以使用上述表名为 sales_table 的表进行演示。
以下语句查找每个员工的 销售额和之前的销售额详情 :
SELECT Year, Product, Sale,
LAG(Sale, 1, 0) OVER (
PARTITION BY Year
ORDER BY Country) AS Previous_Sale_LAG
FROM sales_table;
这个示例首先将结果集按年份划分成分区,然后使用国家列对每个分区进行排序。最后,我们对每个分区应用了LAG()函数来获取前一次的销售明细。执行上述语句后,我们可以看到以下输出:
在输出中,我们可以看到每个分区中的0.00值。它表示在表中不会存在的行的值。如果我们没有提供默认值,它将变为NULL。
注意:LEAD()和LAG()函数是在MySQL 8.0版本中引入的。因此,在之前的版本中我们不能使用它们。它们总是与OVER()子句一起使用。如果我们没有使用这个子句,它会引发一个错误。
本文链接:http://so.lmcjl.com/news/15796/