Un método es usar 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;
Una forma de hacer esto con funciones de ventana (en SQL Server 2012+) es usar un máximo acumulativo en id, en orden 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 subconsulta obtiene el valor del siguiente no NULL
identificación. La consulta externa luego propaga el orig
valor sobre todas las filas con el mismo id (recuerde, en un grupo de filas con el mismo nextid
, solo uno tendrá un no NULL
valor para orig
).