Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So erhalten Sie den vorherigen Wert für Nullwerte

Da Sie sich auf SQL Server 2012 befinden, ist hier eine Version, die dies verwendet. Es ist möglicherweise schneller als andere Lösungen, aber Sie müssen dies an Ihren Daten testen.

sum() over() wird eine laufende Summe nach Id geordnet Hinzufügen von 1 wenn ein Wert in der Spalte vorhanden ist und der aktuelle Wert für null beibehalten wird Werte. Die berechnete laufende Summe wird dann verwendet, um das Ergebnis in first_value() over() zu partitionieren . Der erste Wert, geordnet nach Id für jede "Gruppe" von Zeilen, die von der laufenden Summe generiert werden, hat den gewünschten Wert.

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-Geige

Etwas, das vor SQL Server 2012 funktioniert:

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-Geige