Een methode is om outer apply
. te gebruiken :
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;
Een manier om dit te doen met vensterfuncties (in SQL Server 2012+) is om een cumulatieve max op id te gebruiken, in omgekeerde volgorde:
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;
De subquery krijgt de waarde van de volgende niet-NULL
ID kaart. De buitenste query verspreidt dan de orig
waarde over alle rijen met dezelfde id (onthoud, in een groep rijen met dezelfde nextid
, slechts één heeft een niet-NULL
waarde voor orig
).