📜  MySQL | LEAD() 和 LAG()函数

📅  最后修改于: 2022-05-13 01:54:31.057000             🧑  作者: Mango

MySQL | LEAD() 和 LAG()函数

MySQL 中的 LEAD() 和 LAG()函数用于获取其分区内任何行的前后值。这些函数称为非聚合窗口函数。

窗口函数是对分区或窗口的每一行执行操作的函数。这些函数为每个查询行生成结果,这与将它们分组并生成单个行的聚合函数不太可能。

  • 发生操作的行称为当前行。
  • 与当前行相关或使用哪个函数对当前行进行操作的行集合称为窗口。

LAG()函数用于从当前行之前的行中获取值。

LEAD()函数用于从当前行之后的行中获取值。

句法:
对于 LEAD()函数-

LEAD(expr, N, default) 
          OVER (Window_specification | Window_name)

对于 LAG()函数-

LAG(expr, N, default) 
          OVER (Window_specification | Window_name)

函数中的N默认参数是可选的。

使用的参数:

  1. expr:它可以是列或任何内置函数。
  2. N:它是一个正值,确定当前行之前/之后的行数。如果在查询中省略,则其默认值为 1。
  3. 默认值:这是函数返回的默认值,以防没有行在当前行之前/在当前行之后N行。如果缺少,则默认为 NULL。
  4. OVER():它定义了如何将行划分为组。如果 OVER() 为空,则函数使用所有行计算结果。
  5. Window_specification:它由查询分区子句组成,该子句确定查询行的分区和排序方式。
  6. Window_name:如果在查询中的其他地方指定了窗口,则使用此 Window_name 引用它。

例子:
考虑一个“竞赛”表:-

c_idstart_dateend_date
12015-02-012015-02-04
22015-02-022015-02-05
32015-02-032015-02-07
42015-02-042015-02-06
52015-02-062015-02-09
62015-02-082015-02-10
72015-02-102015-02-11

在上表中,“c_id”代表比赛id,“start_date”和“end_date”分别代表比赛的开始和结束日期。

问题描述:我们必须找出一场比赛将在下一场比赛中崩溃的天数,即否。举行两场比赛的天数。

询问:

Select c_id, start_date, end_date, 
        end_date - lead (start_date) 
        over (order by start_date) 
               + 1 as 'no_of_days' 
                   from contest;

在上面的查询中,“end_date”返回当前比赛的结束日期,lead(start_date) 返回下一个比赛的开始日期。因此,这些日期之间的差加 1 将返回 no。天比赛将发生冲突。

此处,窗口规范由“order by”子句给出,表示lead()函数将按其“start_date”以升序对表进行操作。由于它们没有分区子句,因此将整个表视为一个窗口。

输出:

c_idstart_dateend_dateno_of_days
12015-02-012015-02-043
22015-02-022015-02-053
32015-02-032015-02-074
42015-02-042015-02-061
52015-02-062015-02-092
62015-02-082015-02-101
72015-02-102015-02-11NULL

因为,在第 7 场比赛之后没有比赛,即 (c_id=7)。因此,lead(start_date) 返回 NULL 值。

注意: LEAD() 和 LAG()函数始终与OVER()一起使用。缺少 over 子句将引发错误。