Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Encontre todas as lacunas de inteiros no SQL


A ideia é olhar para onde as lacunas começam. Deixe-me supor que você está usando o SQL Server 2012 e, portanto, tem o lag() e lead() funções. O seguinte obtém o próximo id :
select t.*, lead(id) over (order by id) as nextid
from t;

Se houver uma lacuna, nextid <> id+1 . Agora você pode caracterizar as lacunas usando 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;

EDITAR:

Sem o lead() , eu faria a mesma coisa com uma subconsulta correlacionada:
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;

Assumindo o id é uma chave primária na tabela (ou mesmo que tenha apenas um índice), ambos os métodos devem ter um desempenho razoável.