93

SQL Server テーブルからランダム レコードを取得する簡潔な方法はありますか?

単体テスト データをランダム化したいので、テーブルからランダムな ID を選択する簡単な方法を探しています。英語では、選択は「ID がテーブル内の最小 ID とテーブル内の最大 ID の間の乱数であるテーブルから 1 つの ID を選択する」になります。

クエリを実行し、null 値をテストし、null の場合は再実行しなければ、それを行う方法がわかりません。

アイデア?

4

6 に答える 6

159

SQL Server テーブルからランダム レコードを取得する簡潔な方法はありますか?

はい

SELECT TOP 1 * FROM table ORDER BY NEWID()

説明

NEWID()行ごとに が生成され、テーブルはそれによってソートされます。最初のレコードが返されます (つまり、「最も低い」GUID を持つレコード)。

ノート

  1. バージョン 4 以降、GUID は疑似乱数として生成されます。

    バージョン 4 UUID は、真の乱数または疑似乱数から UUID を生成するためのものです。

    アルゴリズムは次のとおりです。

    • clock_seq_hi_and_reserved の 2 つの最上位ビット (ビット 6 と 7) をそれぞれ 0 と 1 に設定します。
    • time_hi_and_version フィールドの最上位 4 ビット (ビット 12 から 15) をセクション 4.1.3 の 4 ビットのバージョン番号に設定します。
    • 他のすべてのビットをランダムに (または疑似ランダムに) 選択した値に設定します。

    Universally Unique IDentifier (UUID) URN 名前空間 - RFC 4122

  2. 代替手段SELECT TOP 1 * FROM table ORDER BY RAND()は、人が思うようには機能しません。RAND()クエリごとに 1 つの値を返すため、すべての行が同じ値を共有します。

  3. GUID 値は疑似乱数ですが、要求の厳しいアプリケーションにはより優れた PRNG が必要になります。

  4. 典型的なパフォーマンスは、約 1,000,000 行で 10 秒未満です (もちろんシステムによって異なります)。インデックスにヒットすることは不可能であるため、パフォーマンスは比較的制限されることに注意してください。

于 2008-10-10T13:46:58.703 に答える
28

大きなテーブルではTABLESAMPLE、テーブル全体のスキャンを避けるためにこれを使用することもできます。

SELECT  TOP 1 *
FROM YourTable
TABLESAMPLE (1000 ROWS)
ORDER BY NEWID()

ORDER BY NEWIDデータ ページで最初に表示される行だけを返すことを避けるために、 は依然として必要です。

使用する数は、テーブルのサイズと定義に合わせて慎重に選択する必要があり、行が返されない場合は再試行ロジックを検討できます。この背後にある計算と、この手法が小さなテーブルに適していない理由については、こちらで説明しています。

于 2012-08-26T10:24:27.650 に答える
10

また、MIN(Id) と MAX(Id) の間のランダムな ID を取得する方法を試してから、

SELECT TOP 1 * FROM table WHERE Id >= @yourrandomid

常に1行取得されます。

于 2008-10-10T14:13:06.030 に答える