Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Finden Sie alle ganzzahligen Lücken in SQL

Die Idee ist, zu schauen, wo die Lücken beginnen. Lassen Sie mich davon ausgehen, dass Sie SQL Server 2012 verwenden und daher auch die lag() und lead() Funktionen. Folgendes erhält die nächste id :

select t.*, lead(id) over (order by id) as nextid
from t;

Wenn es eine Lücke gibt, dann nextid <> id+1 . Nun können Sie die Lücken mit where charakterisieren :

select id+1 as FirstMissingId, nextid - 1 as LastMissingId
from (select t.*, lead(id) over (order by id) as nextid
      from t
     ) t
where nextid <> id+1;

BEARBEITEN:

Ohne lead() , würde ich dasselbe mit einer korrelierten Unterabfrage machen:

select id+1 as FirstMissingId, nextid - 1 as LastMissingId
from (select t.*,
             (select top 1 id
              from t t2
              where t2.id > t.id
              order by t2.id
             ) as nextid
      from t
     ) t
where nextid <> id+1;

Angenommen die id ein Primärschlüssel für die Tabelle ist (oder sogar nur einen Index hat), sollten beide Methoden eine angemessene Leistung haben.