SQL SERVER中LEAD和LAG函数

SQL SERVER中LEAD和LAG函数


LEAD和LAG函数


LEAD


访问相同结果集的后续行中的数据,而不使用 SQL Server 2012 中的自联接。 LEAD 以当前行之后的给定物理偏移量来提供对行的访问。 在 SELECT 语句中使用此分析函数可将当前行中的值与后续行中的值进行比较。

语法:LEAD ( scalar_expression [ ,offset ] , [ default ] )     OVER ( [ partition_by_clause ] order_by_clause )

scalar_expression,要返回的值基于指定的偏移量。 这是一个返回单个(标量)值的任何类型的表达式。scalar_expression 不能为分析函数

offset默认值为1, offset 可以是列、子查询或其他求值为正整数的表达式,或者可隐式转换为bigintoffset 不能是负数值或分析函数。

default默认值为NULL, offset 可以是列、子查询或其他求值为正整数的表达式,或者可隐式转换为bigintoffset不能是负数值或分析函数


LAG


访问相同结果集的先前行中的数据,而不使用 SQL Server 2012 中的自联接。 LAG 以当前行之前的给定物理偏移量来提供对行的访问。 在 SELECT 语句中使用此分析函数可将当前行中的值与先前行中的值进行比较。


下面看一组SQL语句:

WITH test
as
(
    select NULL as score
    UNION ALL
    select 10
    UNION ALL
    select 20
    UNION ALL
    select 30
    UNION ALL
    select 40
    UNION ALL
    select 50
)
select ROW_NUMBER() over(order by score) as rownum
,score
,LEAD(score) over(order by score) as nextscore1
,LEAD(score,1) over(order by score) as nextscore2
,LEAD(score,1,0) over(order by score) as nextscore3
,LEAD(score,2) over(order by score) as nextscore4
,LAG(score) over(order by score) as previousscore1
,LAG(score,1) over(order by score) as previousscore2
,LAG(score,1,0) over(order by score) as previousscore3
,LAG(score,2) over(order by score) as previousscore4
from test

结果前半部分:

rownum    score    nextscore1    nextscore2    nextscore3    nextscore4
1                 NULL    10                   10                     10                     20
2                10           20                   20                     20                     30
3                20           30                   30                     30                     40
4                30           40                   40                     40                     50
5                40           50                   50                     50                     NULL
6                50           NULL             NULL               0                       NULL

LEAD(score)over(order by score)与LEAD(score,1)over(order by score)相同,基于SCORE升序取下一个score。

LEAD(score,Y)over(order by score)公式:按score升序排列第X行计算LEAD(score,Y)over(order by score)为第X+Y行的值。

对第X行求LEAD(score)over(order by score),值为第X+1行的值。见列nextscore1和nextscore2。

对第X行求LEAD(score,2)over(order by score),值为第X+2行的值。见列nextscore4。

对于第6行,由于没有第7行数据,所以LEAD求出的值为NULL。如果指定默认值,则返回指定默认值。,如LEAD(score,1,0)最后一行返回0。见netsocre3列。

结果后半部分:

rownum    score    previousscore1    previousscore2    previousscore3    previousscore4
1                NULL    NULL                     NULL                           0                             NULL
2               10           NULL                     NULL                          NULL                     NULL
3               20            10                         10                                  10                           NULL
4               30            20                         20                                   20                         10
5               40            30                         30                                   30                          20
6               50           40                          40                                   40                          30

跟LEAD非常相似,只是LAG是往前求值。




  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值