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.