Une méthode consiste à utiliser 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;
Une façon de faire cela avec les fonctions de fenêtre (dans SQL Server 2012+) est d'utiliser un max cumulatif sur l'id, dans l'ordre inverse :
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 sous-requête obtient la valeur du prochain non-NULL
identifiant. La requête externe diffuse alors le orig
valeur sur toutes les lignes avec le même identifiant (rappelez-vous, dans un groupe de lignes avec le même nextid
, un seul aura un non-NULL
valeur pour orig
).