アイデアは、ギャップがどこから始まるかを調べることです。 SQL Server 2012を使用していると仮定します。そのため、lag()
を使用します。 およびlead()
機能。次は次のid
を取得します :
select t.*, lead(id) over (order by id) as nextid
from t;
ギャップがある場合は、nextid <> id+1
。 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;
編集:
lead()
なし 、相関サブクエリでも同じことをします:
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;
id
を想定 がテーブルの主キーである場合(またはインデックスがある場合でも)、どちらの方法でも妥当なパフォーマンスが得られるはずです。