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

Comment obtenir la valeur précédente pour les valeurs nulles

Puisque vous êtes sur SQL Server 2012... voici une version qui l'utilise. Cela peut être plus rapide que d'autres solutions, mais vous devez le tester sur vos données.

sum() over() fera une somme courante ordonnée par Id ajouter 1 lorsqu'il y a une valeur dans la colonne et en gardant la valeur actuelle pour null valeurs. La somme courante calculée est ensuite utilisée pour partitionner le résultat en first_value() over() . La première valeur triée par Id pour chaque "groupe" de lignes générées par la somme cumulée a la valeur souhaitée.

select T.Id,
       first_value(T.FeeModeId) 
          over(partition by T.NF 
               order by T.Id 
               rows between unbounded preceding and current row) as FeeModeId,
       first_value(T.Name)      
          over(partition by T.NS 
               order by T.Id 
               rows between unbounded preceding and current row) as Name,
       T.Amount
from (
     select Id,
            FeeModeId,
            Name,
            Amount,
            sum(case when FeeModeId is null then 0 else 1 end) 
              over(order by Id) as NF,
            sum(case when Name is null then 0 else 1 end) 
              over(order by Id) as NS
     from YourTable
     ) as T

SQL Fiddle

Quelque chose qui fonctionnera avant SQL Server 2012 :

select T1.Id,
       T3.FeeModeId,
       T2.Name,
       T1.Amount
from YourTable as T1
  outer apply (select top(1) Name
               from YourTable as T2
               where T1.Id >= T2.Id and
                     T2.Name is not null
               order by T2.Id desc) as T2
  outer apply (select top(1) FeeModeId
               from YourTable as T3
               where T1.Id >= T3.Id and
                     T3.FeeModeId is not null
               order by T3.Id desc) as T3

SQL Fiddle