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)
一种方法是使用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,只有一个行具有非NULL值orig)。
| 归档时间: |
|
| 查看次数: |
3456 次 |
| 最近记录: |