Jedną z metod jest użycie 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;
Jednym ze sposobów, aby to zrobić za pomocą funkcji okna (w SQL Server 2012+) jest użycie skumulowanego maksimum na id, w odwrotnej kolejności:
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;
Podzapytanie pobiera wartość następnej innej niż NULL
ID. Zewnętrzne zapytanie następnie rozkłada orig
wartość nad wszystkimi wierszami o tym samym identyfikatorze (pamiętaj, w grupie wierszy o tym samym nextid
, tylko jeden będzie miał wartość inną niż NULL
wartość dla orig
).