En metode er at bruge 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;
En måde du kan gøre dette med vinduesfunktioner (i SQL Server 2012+) er at bruge et kumulativt max på id, i omvendt rækkefølge:
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;
Underforespørgslen får værdien af den næste ikke-NULL
id. Den ydre forespørgsel spreder derefter orig
værdi over alle rækker med samme id (husk, i en gruppe rækker med samme nextid
, vil kun én have en ikke-NULL
værdi for orig
).