SQL获取列中下一个非空值

Ale*_*hov 1 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
Run Code Online (Sandbox Code Playgroud)

我需要这些数据:

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
Run Code Online (Sandbox Code Playgroud)

启动代码:

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;
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

一种方法是使用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;
Run Code Online (Sandbox Code Playgroud)

使用窗口函数(在 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;
Run Code Online (Sandbox Code Playgroud)

子查询获取下一个非 id 的值NULL。然后,外部查询将orig值分布到具有相同 id 的所有行上(请记住,在一组具有相同 id 的行中nextid,只有一个行具有非NULLorig)。