SQL在

时间:2015-11-05 20:01:38

标签: sql sql-server sql-server-2012

如何在列中获得下一个非空值?我有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;

1 个答案:

答案 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的一组行中,只有一个具有非NULLorig)。