sql >> Base de Datos >  >> RDS >> Sqlserver

SQL para obtener el siguiente valor no nulo en la columna

Un método es usar 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;

Una forma de hacer esto con funciones de ventana (en SQL Server 2012+) es usar un máximo acumulativo en id, en orden 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 subconsulta obtiene el valor del siguiente no NULL identificación. La consulta externa luego propaga el orig valor sobre todas las filas con el mismo id (recuerde, en un grupo de filas con el mismo nextid , solo uno tendrá un no NULL valor para orig ).