0

SQL Serverデータベーステーブルに列があり、整数値を含む列があり、系列にギャップがない限り最大値を取得したいので、最初に欠落している値を取得したいと思います。

たとえば、以下の表から、値4を取得しようとしています。

1
2
null
3

上記は単純ですが、テーブルに以下のようなデータが含まれている場合、どのIDが欠落しているかをどのように見つけることができますか?この場合は8になります

1
3
2
4
null
5
7
6
null
10
9

//////////////////

編集:

私は最初に@podiluskaの回答を実装し、それを受け入れるつもりでしたが、10K行を超えるテーブルでテストしたときは非常に遅いので、@ vmvadivelの回答を取得し、以下に示すように少し変更しました。私が望んでいたものを100%ではありません:

SELECT Number
FROM 
(
    SELECT ROW_NUMBER() OVER(ORDER BY iValue) AS Number
    FROM tblNumbers WHERE iValue IS NOT NULL
) temp
WHERE Number NOT IN 
(
    SELECT iValue FROM tblNumbers WHERE iValue IS NOT NULL
)

これは非常にうまく機能しますが、すべてのiValueフィールドがnullの場合、何も返されませんが、1を返すようにします。これは、一連の最初の値になるためです。明らかに、C#コードでこれを処理できますが、確かに上記のクエリが行を返さない場合、1を返す方法が必要ですか?

トップレベルSelect Numberを変更しましSELECT Coalesce(Number, 1)たが、機能しませんでした。これを解決する方法はありますか?

ありがとう

4

3 に答える 3

5

あなた#tのテーブルなら

select min(t1.number)+1 
from #t t1
left join #t t2 
           on t1.number = t2.number-1
where t2.number is null
于 2012-07-17T09:31:40.907 に答える
1
SELECT
    t1.number + 1 AS range_start,
    MIN(t2.number) - 1 AS range_end
FROM test t1
INNER JOIN test t2
    ON t2.number > t1.number
WHERE t1.number IS NOT NULL
GROUP BY t1.number
HAVING t1.number + 1 <= MIN(t2.number) - 1

15テーブルに数値を追加すると、出力は次のようになります。

range_start  range_end
          8          8
         11         14

少なくとも1つのギャップがある、連続する数値の各ペアを検索します。次に、これに1を加算または減算します。これにより、start_rangeend_rangeはギャップの範囲になります。

于 2012-07-17T10:09:10.770 に答える
1

順次int値を含む数値テーブルがある場合は、次のように実行できます。

SELECT * FROM 
(
    SELECT ROW_NUMBER() OVER(ORDER BY iValue) AS Number FROM tblNumbers
) temp
WHERE Number NOT IN 
(
    SELECT [ID] FROM tblFindGaps
)
GO
于 2012-07-17T10:59:18.377 に答える