sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man får tidigare värde för nollvärden

Eftersom du är på SQL Server 2012... här är en version som använder det. Det kan vara snabbare än andra lösningar men du måste testa det på din data.

sum() over() kommer att göra en löpande summa sorterad efter Id lägger till 1 när det finns ett värde i kolumnen och behålla det aktuella värdet för null värden. Den beräknade löpande summan används sedan för att partitionera resultatet i first_value() over() . Det första värdet sorterat efter Id för varje "grupp" av rader som genereras av den löpande summan har det värde du vill ha.

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

Något som kommer att fungera före 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



  1. Laravel kapslade relationer

  2. MySQL - Den här versionen av MySQL stöder ännu inte 'LIMIT &IN/ALL/NOY/SOME underquery

  3. ASP.NET MVC 4 EF5 med MySQL

  4. MySQL lagrad procedur vs funktion, vilken skulle jag använda när?