Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como obter o valor anterior para valores nulos


Já que você está no SQL Server 2012... aqui está uma versão que usa isso. Pode ser mais rápido do que outras soluções, mas você precisa testar isso em seus dados.

sum() over() fará uma soma em execução ordenada por Id adicionando 1 quando há um valor na coluna e mantendo o valor atual para null valores. A soma de execução calculada é então usada para particionar o resultado em first_value() over() . O primeiro valor ordenado por Id pois cada "grupo" de linhas gerado pela soma corrente tem o valor que você deseja.
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

Algo que funcionará antes do 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