sql >> Database >  >> RDS >> Sqlserver

Vind alle gaten in gehele getallen in SQL

Het idee is om te kijken waar de hiaten beginnen. Laat me aannemen dat u SQL Server 2012 gebruikt, en dat geldt ook voor de lag() en lead() functies. Het volgende krijgt de volgende id :

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

Als er een gat is, dan nextid <> id+1 . U kunt de hiaten nu karakteriseren met 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;

BEWERKEN:

Zonder de lead() , zou ik hetzelfde doen met een gecorreleerde subquery:

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;

Uitgaande van de id is een primaire sleutel op de tafel (of zelfs dat het alleen een index heeft), beide methoden zouden redelijke prestaties moeten hebben.



  1. Hoe selecteer je een varchar2-veld in het formaat 'HH24:MI:SSxFF6' als INTERVAL HOUR TO SECOND (6)?

  2. SQL met alle verjaardagen binnen de volgende en vorige 14 dagen

  3. PostgreSQL INSERT FROM SELECT met extra kolom

  4. Nieuwe MYSQL-installatie, toegang geweigerd voor gebruiker 'root'