SQL Server 2012中的LAG功能

时间:2015-03-17 11:10:57

标签: sql-server

我正在使用SQL Server 2012。

这是我的问题:

create table #t(id int,amt int)

insert into #t values(1, 100), (1, 200), (2, 300), (2, 500), (2, 800)

select 
    id, amt, 
    lag(amt, 1, null) over (partition by id order by amt) as prev_amt,
    lead(amt, 1, null) over (partition by id order by amt) as next_value
from #t

返回:

id  amt   prev_amt  next_value
----------------------------
1   100   NULL      200
1   200   100       NULL
2   300   NULL      500
2   500   300       800
2   800   500       NULL

当我将查询更改为

select 
    id, amt,
    lag(amt, 1, null) over (partition by id order by amt desc) as prev_amt,
    lead(amt, 1, null) over (partition by id order by amt desc) as next_value
from #t

结果是:

id  amt prev_amt    next_value
1   200 NULL    100                    
1   100 200 NULL                        
2   800 NULL    500
2   500 800 300
2   300 500 NULL

我不明白为什么会这样做?

   id   amt prev_amt    next_value
    1   200 NULL    100      

以前的金额应该是100?

1 个答案:

答案 0 :(得分:2)

此处key字是WINDOW个函数。 实际上你有工作窗口,这些功能在这些窗口中工作。

对于第一个陈述,你有窗口:

/---------\
| 1   100 |
| 1   200 |
\---------/

对于第1行,前一个值为NULL,因为你不在窗口(上图),接下来是200.对于第2行,previous是100,next是NULL,因为你不在窗口(下面)。

在第二个语句窗口中已更改:

/---------\
| 1   200 |
| 1   100 |
\---------/

对于第1行,前一个值仍然是NULL,因为你不在窗口(上图),接下来是100.对于第2行,前面是200,下一个仍然是NULL,因为你不在窗口(下面)。