Un metodo consiste nell'usare 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;
Un modo per farlo con le funzioni della finestra (in SQL Server 2012+) consiste nell'utilizzare un massimo cumulativo su ID, in ordine inverso:
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;
La sottoquery ottiene il valore del successivo non NULL
id. La query esterna diffonde quindi l'orig
valore su tutte le righe con lo stesso id (ricorda, in un gruppo di righe con lo stesso nextid
, solo uno avrà un non NULL
valore per orig
).