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和默认参数是可选的。
使用的参数:
- expr:它可以是列或任何内置函数。
- N:它是一个正值,确定当前行之前/之后的行数。如果在查询中省略,则其默认值为 1。
- 默认值:这是函数返回的默认值,以防没有行在当前行之前/在当前行之后N行。如果缺少,则默认为 NULL。
- OVER():它定义了如何将行划分为组。如果 OVER() 为空,则函数使用所有行计算结果。
- Window_specification:它由查询分区子句组成,该子句确定查询行的分区和排序方式。
- Window_name:如果在查询中的其他地方指定了窗口,则使用此 Window_name 引用它。
例子:
考虑一个“竞赛”表:-c_id start_date end_date 1 2015-02-01 2015-02-04 2 2015-02-02 2015-02-05 3 2015-02-03 2015-02-07 4 2015-02-04 2015-02-06 5 2015-02-06 2015-02-09 6 2015-02-08 2015-02-10 7 2015-02-10 2015-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_id start_date end_date no_of_days 1 2015-02-01 2015-02-04 3 2 2015-02-02 2015-02-05 3 3 2015-02-03 2015-02-07 4 4 2015-02-04 2015-02-06 1 5 2015-02-06 2015-02-09 2 6 2015-02-08 2015-02-10 1 7 2015-02-10 2015-02-11 NULL
因为,在第 7 场比赛之后没有比赛,即 (c_id=7)。因此,lead(start_date) 返回 NULL 值。
注意: LEAD() 和 LAG()函数始终与OVER()一起使用。缺少 over 子句将引发错误。