Idenya adalah untuk melihat di mana kesenjangan dimulai. Biarkan saya berasumsi Anda menggunakan SQL Server 2012, dan memiliki lag()
dan lead()
fungsi. Berikut ini mendapatkan id
berikutnya :
select t.*, lead(id) over (order by id) as nextid
from t;
Jika ada celah, maka nextid <> id+1
. Anda sekarang dapat mengkarakterisasi kesenjangan menggunakan 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;
EDIT:
Tanpa lead()
, saya akan melakukan hal yang sama dengan subquery yang berkorelasi:
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;
Dengan asumsi id
adalah kunci utama pada tabel (atau bahkan hanya memiliki indeks), kedua metode harus memiliki kinerja yang wajar.