Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL pour obtenir la prochaine valeur non nulle dans la colonne

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 ).