Един от методите е да използвате 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;
Един от начините, по които можете да направите това с прозоречни функции (в SQL Server 2012+), е да използвате кумулативен максимум за id в обратен ред:
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;
Подзаявката получава стойността на следващия не-NULL
документ за самоличност. След това външната заявка разпространява orig
стойност върху всички редове с еднакъв id (не забравяйте, че в група редове с еднакъв nextid
, само един ще има не-NULL
стойност за orig
).