mysql中lead_MySQL LEAD() and 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。

default:如果在当前行之前/之后没有行N行的情况下,它是函数返回的默认值。如果缺少,则默认为NULL。

OVER():它定义了如何将行划分为组。如果OVER()为空,则函数使用所有行计算结果。

Window_specification:它由查询分区子句组成,该子句确定查询行的分区和排序方式。

Window_name:如果在查询的其他位置指定了窗口,则使用此Window_name对其进行引用。

例:

考虑一个“contest”表:

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”返回当前比赛的结束日期,线索(start_date)返回下一个比赛的开始日期。因此,这些日期之间的差加1将返回否。比赛将在几天后发生冲突。

此处,窗口规范由“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子句将引发错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值