sql >> Database >  >> RDS >> Sqlserver

SQL om de volgende niet-null-waarde in de kolom te krijgen

Een methode is om outer apply . te gebruiken :

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;

Een manier om dit te doen met vensterfuncties (in SQL Server 2012+) is om een ​​cumulatieve max op id te gebruiken, in omgekeerde volgorde:

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;

De subquery krijgt de waarde van de volgende niet-NULL ID kaart. De buitenste query verspreidt dan de orig waarde over alle rijen met dezelfde id (onthoud, in een groep rijen met dezelfde nextid , slechts één heeft een niet-NULL waarde voor orig ).




  1. Aspecten van strings in .NET

  2. Hoe kan ik beperkingen uit mijn MySQL-tabel verwijderen?

  3. Hoe PHP in te checken als er meer PDO-parameters zijn opgegeven dan nodig?

  4. Een JSON-array met objecten opvragen in Postgres