Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come ottenere il valore precedente per i valori nulli

Dato che sei su SQL Server 2012... ecco una versione che lo usa. Potrebbe essere più veloce di altre soluzioni, ma devi testarlo sui tuoi dati.

sum() over() farà una somma corrente ordinata per Id aggiungendo 1 quando è presente un valore nella colonna e mantenendo il valore corrente per null valori. La somma corrente calcolata viene quindi utilizzata per partizionare il risultato in first_value() over() . Il primo valore ordinato per Id per ogni "gruppo" di righe generato dalla somma corrente ha il valore che desideri.

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

Qualcosa che funzionerà prima di 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