En metod är att använda 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;
Ett sätt du kan göra detta med fönsterfunktioner (i SQL Server 2012+) är att använda ett kumulativt max på id, i omvänd ordning:
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;
Underfrågan får värdet av nästa icke-NULL
id. Den yttre frågan sprider sedan orig
värde över alla rader med samma id (kom ihåg, i en grupp rader med samma nextid
, endast en har en icke-NULL
värde för orig
).