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

SQL per ottenere il valore successivo non nullo nella colonna

Un metodo consiste nell'usare outer apply :

select t.*, t2.orig as newval
from @t t outer apply
     (select top 1 t2.*
      from @t t2
      where t2.id >= t.id and t2.orig is not null
      order by t2.id
     ) t2;

Un modo per farlo con le funzioni della finestra (in SQL Server 2012+) consiste nell'utilizzare un massimo cumulativo su ID, in ordine inverso:

select t.*, max(orig) over (partition by nextid) as newval
from (select t.*,
             min(case when orig is not null then id end) over (order by id desc) as nextid
      from @t
     ) t;

La sottoquery ottiene il valore del successivo non NULL id. La query esterna diffonde quindi l'orig valore su tutte le righe con lo stesso id (ricorda, in un gruppo di righe con lo stesso nextid , solo uno avrà un non NULL valore per orig ).