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

Sådan får du tidligere værdi for null-værdier

Da du er på SQL Server 2012... er her en version, der bruger det. Det kan være hurtigere end andre løsninger, men du skal teste det på dine data.

sum() over() vil lave en løbende sum sorteret efter Id tilføjer 1 når der er en værdi i kolonnen og beholder den aktuelle værdi for null værdier. Den beregnede løbende sum bruges derefter til at opdele resultatet i first_value() over() . Den første værdi sorteret efter Id for hver "gruppe" af rækker, der genereres af den løbende sum, har den værdi, du ønsker.

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

Noget der vil fungere før 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. 2 funktioner, der returnerer måneden fra en dato i Oracle

  2. SQL FLOAT:3 punkter, der hjælper dig med at undgå underlige matematiske fejl

  3. MYSQL tilføjer ikke info til min database

  4. PDO-fejlretning - Se forespørgsel EFTER Bind?