問題

  • テーブルの1列に格納された一意な数が、歯抜けのない完全な連番を成しているか、それともギャップ(1つ以上連続する欠番)を含むかどうかを調べる。

CREATE TABLE Numbers (seq INTEGER NOT NULL PRIMARY KEY);

 (Numbers:自然数テーブル、seq:連番)

chiakiの解答


考え方


  • 欠番があるかどうかだけ調べたいなら、数の個数が(最大の数ー最小の数+1)個あれば良い。
  • 注1)seq は PRIMARY KEY なので、同じ数字はないという前提の下である。
  • 注2)連番と書いてあるので、数が順に並んでいない場合は考えていない。

SQL文


SELECT CASE WHEN count(N2.seq) = (SELECT (max(N1.seq) - min(N1.seq) +1)
                                 FROM Numbers N1)
       THEN 'has no missing number'
       ELSE 'exist missing number'
       END AS Numbers
FROM Numbers N2;

実行結果


 seq
-----
   2
   3
   5
   7
   8
  14
  20  の場合

       numbers
----------------------
 exist missing number

 seq
-----
   2
   3
   4
   5
   6
   7
   8  の場合

        numbers
-----------------------
 has no missing number

  • 値が1個や2個の場合も成功しました☆
最終更新:2008年06月24日 16:25