如何在列中获得下一个非空值?我有MSSQL 2012和只有一列的表。像这样:
rownum Orig
------ ----
1 NULL
2 NULL
3 9
4 NULL
5 7
6 4
7 NULL
8 9
我需要这些数据:
Rownum Orig New
------ ---- ----
1 NULL 9
2 NULL 9
3 9 9
4 NULL 7
5 7 7
6 4 4
7 NULL 5
8 9 5
开始的代码:
declare @t table (rownum int, orig int);
insert into @t values (1,NULL),(2,NULL),(3,9),(4,NULL),(5,7),(6,4),(7,NULL),(8,9);
select rownum, orig from @t;
答案 0 :(得分:4)
一种方法是使用outer apply
:
select t.*, t2.orig as newval
from @t t outer apply
(select top 1 t2.*
from @t t2
where t2.id >= t.id and t2.orig is not null
order by t2.id
) t2;
使用窗口函数(在SQL Server 2012+中)执行此操作的一种方法是使用id的累积最大值,顺序相反:
select t.*, max(orig) over (partition by nextid) as newval
from (select t.*,
min(case when orig is not null then id end) over (order by id desc) as nextid
from @t
) t;
子查询获取下一个非NULL
id的值。外部查询然后将orig
值传播到具有相同ID的所有行(请记住,在具有相同nextid
的一组行中,只有一个具有非NULL
值orig
)。