1より大きい値から始まる数列が連番か調べる

達人SQL1-10の「欠番を探せ:発展版」のまとめです。

こちらの記事でも書きましたが、テーブルの中で連続していそうな番号が実際に連番になっているかどうかを検証するときには以下のようにすれば出来ます。

select 'has gap' as result
from numbers
having count(*) <> max(number);

ところが、これは「番号が1から始まっている」ということを前提にしているので、次のような場合には誤った答えが返ってきます。

number
3
4
5
6
7

この場合にも正しく連番になっているかどうかを調べるためには、カラム内の数字の最大値と最小値を考慮すればうまくいきます。

select 'has gap' as result
from numbers
having count(*) <> max(number) - min(number) + 1;

また、このクエリは連番でないことを条件にしているので、カラムが本当に連番だった場合は値を返してくれません。 仮に連番であったとしても何かしらの値を返してもらいたい場合は、次のようにhaving句の内容をselect句に持っていきます。

select
    case when count(*) <> max(number) - min(number) + 1 then 'has gap'
         else 'no gap' end as result
from numbers;

個人的な感想

この「having句の内容をselect句で書き直す」というのはできるようになっておきたい。


達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)
ミック
翔泳社
売り上げランキング: 10,012