質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

5回答

3288閲覧

SQLServerにおいて、連番の歯抜けの最小値を取得する方法

kurimaron

総合スコア12

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2019/09/04 12:35

編集2019/09/06 01:36

SQLServer2017です。
例えば、あるテーブルに整数型のカラム"番号"が存在するとします。
カラム"番号"には、次のような6レコードが入っていたとします。
1,2,3,6,7,8
このとき、小さい値からソートした場合4,5が抜けていますが、そのうち小さい方の’4’という値をT-SQLで取得したいです。

とりあえずfetch文を用いればできるのはわかるのですが、ループを用いる方法以外で、エレガントな書き方はあるでしょうか。

追記
SQLの例は、次の通りです。

SQL

1CREATE TABLE [test_table] ( 2 [番号] int, 3) 4INSERT INTO [test_table](番号) 5 VALUES(1),(2),(3),(6),(7),(8)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2019/09/04 13:28

質問にCREATE TABLE文と数件のテーブルに存在するデータのINSERT文も載せた方が適切なコメントが付き易いです。
kurimaron

2019/09/06 01:37

追記いたしました。
guest

回答5

0

ベストアンサー

sql

1SELECT 2 MIN( 番号 + 1 ) AS 最小欠番 3FROM 4 test_table 5WHERE 6 ( 番号 + 1 ) NOT IN ( SELECT 番号 FROM test_table ); 7

とか

sql

1SELECT 2 MIN( a.番号 + 1 ) AS 最小欠番 3FROM 4 test_table a LEFT JOIN test_table b ON a.番号 + 1 = b.番号 5WHERE b.番号 IS NULL;

たぶん後者の方が高速

追記

連番は 1 から始まる前提で、1 がないときは 1 を返してほしい場合は、
下記のようなSQLでどうかな?

sql

1SELECT 2 Min(a.番号) + 1 AS 最小欠番 3FROM 4 (SELECT 番号 FROM test_table 5 UNION ALL 6 SELECT 0 AS 番号) a 7LEFT JOIN test_table b 8ON a.番号 + 1 = b.番号 9WHERE b.番号 IS NULL;

データ 3,4,6,7,8 の場合でも 1 を返します。

SQLServer や Access では、FROM句を省略して書くことで、DUALテーブルと同等のことができるのを利用。

投稿2019/09/05 03:50

編集2019/09/05 13:10
hatena19

総合スコア33757

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

欠番を見つけるSQL

上記を参考に最小値を取る場合はmin()で取得

投稿2019/09/04 14:59

sazi

総合スコア25197

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SQLServerで連番データnot exists のデータの最小値を取得しては?

投稿2019/09/04 12:46

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

not existsmin関数でSQLを組む。

これだけだと、データが2,3,6,7,8だった場合も「4」になる。
それで良ければ、ここまでで解決。

「1」を返して欲しいよって場合は、

SELECT文1つで完結させたいなら、CASE (Transact-SQL)を使う。

投稿2019/09/05 05:09

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/09/05 05:15

1が欲しい場合は、相対値を-1にすれば良いですよ。 ※次の欠番:相対値=+1、前の欠番:相対値=-1
退会済みユーザー

退会済みユーザー

2019/09/05 05:44

saziさん、ありがとうございます。 「番号は1から」って前提なら、caseで思い切った方がイージーだと思いました。
sazi

2019/09/05 05:53

caseを使用して1番を取得できますか?
退会済みユーザー

退会済みユーザー

2019/09/06 05:00

caseで1を返すイメージでした。 hatena19さんの「追記」のSQLがよいです。
guest

0

not existsと自己結合だけでやるとこんな感じかなあ

sql

1with あるテーブル as ( 2 select 1 as 番号 3 union all 4 select 2 as 番号 5 union all 6 select 3 as 番号 7 union all 8 select 6 as 番号 9 union all 10 select 8 as 番号 11) 12select top 1 A.番号 as 次のない番号,A.番号+1 as 欠番 13from あるテーブル as A 14where not exists ( 15 select 0 16 from あるテーブル as B 17 where B.番号=A.番号+1 18) 19order by A.番号

投稿2019/09/05 01:23

sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問