Jednou z metod je použití 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;
Jedním ze způsobů, jak to udělat s funkcemi okna (v SQL Server 2012+), je použít kumulativní maximum pro id v obráceném pořadí:
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;
Dílčí dotaz získá hodnotu dalšího non-NULL
id. Vnější dotaz pak rozšíří orig
hodnotu ve všech řádcích se stejným ID (pamatujte, že ve skupině řádků se stejným nextid
, pouze jeden bude mít jinou hodnotu než NULL
hodnotu pro orig
).