MYSQL lag() 和lead()函数使用介绍

语法

简单理解,选择第3行数据,LAG()提取先前行(3行之前)内容,LEAD()提取后续行(3行之后)的数据。两者语法没有区别,就是方向不同。

LEAD()函数是一个窗口函数,允许您向前看多行并从当前行访问行的数据。与LAG()函数类似,LEAD()函数对于计算同一结果集中当前行和后续行之间的差异非常有用。

LAG语法LAG(<expression>[,offset[, default_value]]) OVER ( PARTITION BY expr,... ORDER BY expr [ASC|DESC],... )

LEAD语法LEAD(<expression>[,offset[, default_value]]) OVER ( PARTITION BY (expr) ORDER BY (expr))

  • expression:LEAD()函数返回的值expression从offset-th有序分区排。
  • offset:offset是从当前行向前行的行数,以获取值。offset必须是一个非负整数。如果offset为零,则LEAD()函数计算expression当前行的值。如果省略 offset,则LEAD()函数默认使用一个。
  • default_value:如果没有后续行,则LEAD()函数返回default_value。例如,如果offset是1,则最后一行的返回值为default_value。如果您未指定default_value,则函数返回 NULL 。
  • PARTITION BY子句:PARTITION BY子句将结果集中的行划分LEAD()为应用函数的分区。如果PARTITION BY未指定子句,则结果集中的所有行都将被视为单个分区。
  • ORDER BY子句:ORDER BY子句确定LEAD()应用函数之前分区中行的顺序。

例题一:

以下语句查找每个客户的订单日期和下一个订单日期:

SELECT 
    customerName,
    orderDate,
    LEAD(orderDate,1) OVER ( #返回的值是向前一行的orderDate,没有定义后续行,返回NULL。
        PARTITION BY customerNumber #根据customerNumber分组
        ORDER BY orderDate ) nextOrderDate #根据orderDate排序
FROM 
    orders
INNER JOIN customers USING (customerNumber); 

结果输出:
+------------------------------------+------------+---------------+
| customerName                       | orderDate  | nextOrderDate |
+------------------------------------+------------+---------------+
| Atelier graphique                  | 2013-05-20 | 2014-09-27    |
| Atelier graphique                  | 2014-09-27 | 2014-11-25    |
| Atelier graphique                  | 2014-11-25 | NULL          |
| Signal Gift Stores                 | 2013-05-21 | 2014-08-06    |
| Signal Gift Stores                 | 2014-08-06 | 2014-11-29    |
| Signal Gift Stores                 | 2014-11-29 | NULL          |
| Australian Collectors, Co.         | 2013-04-29 | 2013-05-21    |
| Australian Collectors, Co.         | 2013-05-21 | 2014-02-20    |
| Australian Collectors, Co.         | 2014-02-20 | 2014-11-24    |
| Australian Collectors, Co.         | 2014-11-24 | 2014-11-29    |
| Australian Collectors, Co.         | 2014-11-29 | NULL          |
| La Rochelle Gifts                  | 2014-07-23 | 2014-10-29    |
| La Rochelle Gifts                  | 2014-10-29 | 2015-02-03    |
| La Rochelle Gifts                  | 2015-02-03 | 2015-05-31    |
| La Rochelle Gifts                  | 2015-05-31 | NULL          |
| Baane Mini Imports                 | 2013-01-29 | 2013-10-10    |
| Baane Mini Imports                 | 2013-10-10 | 2014-10-15    |
...

例题二:使用LAG()和LEAD()的结果一样

编写一个 SQL 查询,查找所有至少连续出现三次的数字。

输入表格:
+----+-----+
| Id | Num |
+----+-----+
| 1  |  1  |
| 2  |  1  |
| 3  |  1  |
| 4  |  2  |
| 5  |  1  |
| 6  |  2  |
| 7  |  2  |
+----+-----+

SQL语句:
SELECT DISTINCT Num as ConsecutiveNums
FROM(
    SELECT Id,Num,
    Lead(Num,1)OVER() as num_1, #选择指定行的向前一行的内容
    Lead(Num,2)OVER() as num_2  #选择指定行的向前两行的内容
    FROM Logs
) as c
WHERE c.Num = c.num_1 AND c.num_1 = c.num_2 #这三个数都要相等。

结果输出:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+

  • 16
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: MySQL 中的 LEADLAG 窗口函数用于在查询结果中比较相邻行。LEAD 函数用于获取某行之后的一行数据,而 LAG 函数用于获取某行之前的一行数据。这两个函数可以帮助我们在查询结果中比较相邻行的数据。 ### 回答2: leadlagMySQL中新引入的窗口函数,用于在结果集中快速提取某一列的前后行数据。这两个窗口函数通常与OVER子句结合使用,OVER子句用于定义引用当前行之前或之后的行的窗口规格。 LEAD函数可以返回当前行之后的指定行数的值,也可以返回当前行后的第一行中指定列的值。LAG函数可以返回当前行之前的指定行数的值,也可以返回当前行前的第一行中指定列的值。 例如,可以使用LEAD函数来查找当前行之后的第一行的销售额,或者使用LAG函数来查找当前行之前的第二行的销售额。下面是具体的使用示例: SELECT order_id, customer_id, order_date, amount, LEAD(amount, 1) OVER (PARTITION BY customer_id ORDER BY order_date) AS next_amount, LAG(amount, 2) OVER (PARTITION BY customer_id ORDER BY order_date) AS previous_amount FROM sales_orders; 在这个示例中,LEAD函数用于在当前行之后查找销售额,而LAG函数用于在当前行之前查找销售额。这些函数的结果将作为新的列添加到结果集中,并与原始列一起返回。 总的来说,LEADLAG函数使得在MySQL中提取当前行之前或之后的行的操作变得更加简单和方便。这些函数在处理大量数据时非常有用,可以用于各种类型的分析和报告。 ### 回答3: MySQL中的LEADLAG函数都是窗口函数,它们在执行SELECT查询时可以访问当前行和它之前和之后的行,是重要的数据分析函数之一。LEAD函数用于访问下一行的值,而LAG函数则用于访问上一行的值。这两个函数以相对顺序依次对行进行排序。 LEAD函数的语法如下: LEAD(expression, offset, default_value) OVER (PARTITION BY partition_expression ORDER BY sort_expression) 该函数可用于访问指定行的后面行或列的值。其中,“expression”是需要查找的列或表达式,“offset”是要跳过的行数,“default_value”是当没有可用行时要返回的默认值。可以使用“PARTITION BY partition_expression”对查询结果进行分区,以便在每个分区内使用不同的偏移量,“ORDER BY sort_expression”可用于对结果进行排序。 LAG函数的语法如下: LAG(expression, offset, default_value) OVER (PARTITION BY partition_expression ORDER BY sort_expression) 该函数可用于访问指定行的前面行或列的值,其中参数的含义与LEAD函数相似。 LEADLAG函数通常用于处理多行数据,可用于计算行之间的差异或比较当前行与之前或之后的行。例如,在处理时间序列数据时,它们可以用于计算前一个或后一个时间点的值。 在MySQL中,LEADLAG函数是很有用的工具,因为它们可以大幅简化某些查询的编写,并且可让开发人员运用类似EXCEL或SPSS这类数据分析软件的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值