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

Encuentre todas las brechas de enteros en SQL

La idea es mirar dónde empiezan las brechas. Permítanme suponer que está utilizando SQL Server 2012, por lo que tiene el lag() y lead() funciones Lo siguiente obtiene el siguiente id :

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

Si hay una brecha, entonces nextid <> id+1 . Ahora puede caracterizar las brechas 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:

Sin el lead() , haría lo mismo con una 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;

Asumiendo el id es una clave principal en la tabla (o incluso que solo tiene un índice), ambos métodos deberían tener un rendimiento razonable.