sql >> Databasteknik >  >> RDS >> Sqlserver

Hitta alla heltalsluckor i SQL

Tanken är att titta på var klyftorna börjar. Låt mig anta att du använder SQL Server 2012, och så har du lag() och lead() funktioner. Följande får nästa id :

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

Om det finns ett gap, då nextid <> id+1 . Du kan nu karakterisera luckorna med where :

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;

EDIT:

Utan lead() , jag skulle göra samma sak med en korrelerad underfråga:

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;

Förutsatt id är en primärnyckel på bordet (eller till och med att den bara har ett index), bör båda metoderna ha rimlig prestanda.



  1. Hur man kontrollerar om användarnamn redan finns med PHP/MYSQL

  2. Två frågor för att formatera tidsstämpel och nummer med postgresql

  3. 8 sätt att lägga till dagar till ett datum i MariaDB

  4. Hur SESSION_CONTEXT() fungerar i SQL Server