sql >> Databáze >  >> RDS >> Sqlserver

Jak získat předchozí hodnotu pro hodnoty Null

Protože používáte SQL Server 2012... zde je verze, která to používá. Může být rychlejší než jiná řešení, ale musíte to otestovat na svých datech.

sum() over() provede průběžný součet seřazený podle Id přidání 1 když je ve sloupci hodnota a ponechá se aktuální hodnota pro null hodnoty. Vypočítaný průběžný součet se pak použije k rozdělení výsledku v first_value() over() . První hodnota seřazená podle Id pro každou "skupinu" řádků generovaných průběžným součtem má požadovanou hodnotu.

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ěco, co bude fungovat před 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. Jak zaznamenávat sekvenční kolekce záznamů v MySQL

  2. Rychlejší načítání velkých dat

  3. MySQL - součet hodnot sloupců na základě řádku ze stejné tabulky

  4. Nejrychlejší způsob, jak odstranit nečíselné znaky z VARCHAR v SQL Server