我正在使用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?
答案 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,因为你不在窗口(下面)。