Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Trouver tous les écarts d'entiers en SQL

L'idée est de regarder où commencent les lacunes. Laissez-moi supposer que vous utilisez SQL Server 2012, et que vous avez donc le lag() et lead() les fonctions. Ce qui suit obtient le prochain id :

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

S'il y a un espace, alors nextid <> id+1 . Vous pouvez maintenant caractériser les écarts en utilisant 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;

MODIFIER :

Sans le lead() , je ferais la même chose avec une sous-requête corrélée :

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;

En supposant que l'id est une clé primaire sur la table (ou même qu'elle a juste un index), les deux méthodes devraient avoir des performances raisonnables.