SQL Server テーブルからランダム レコードを取得する簡潔な方法はありますか?
単体テスト データをランダム化したいので、テーブルからランダムな ID を選択する簡単な方法を探しています。英語では、選択は「ID がテーブル内の最小 ID とテーブル内の最大 ID の間の乱数であるテーブルから 1 つの ID を選択する」になります。
クエリを実行し、null 値をテストし、null の場合は再実行しなければ、それを行う方法がわかりません。
アイデア?
SQL Server テーブルからランダム レコードを取得する簡潔な方法はありますか?
単体テスト データをランダム化したいので、テーブルからランダムな ID を選択する簡単な方法を探しています。英語では、選択は「ID がテーブル内の最小 ID とテーブル内の最大 ID の間の乱数であるテーブルから 1 つの ID を選択する」になります。
クエリを実行し、null 値をテストし、null の場合は再実行しなければ、それを行う方法がわかりません。
アイデア?
SQL Server テーブルからランダム レコードを取得する簡潔な方法はありますか?
はい
SELECT TOP 1 * FROM table ORDER BY NEWID()
NEWID()
行ごとに が生成され、テーブルはそれによってソートされます。最初のレコードが返されます (つまり、「最も低い」GUID を持つレコード)。
バージョン 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 ビットのバージョン番号に設定します。
- 他のすべてのビットをランダムに (または疑似ランダムに) 選択した値に設定します。
代替手段SELECT TOP 1 * FROM table ORDER BY RAND()
は、人が思うようには機能しません。RAND()
クエリごとに 1 つの値を返すため、すべての行が同じ値を共有します。
GUID 値は疑似乱数ですが、要求の厳しいアプリケーションにはより優れた PRNG が必要になります。
典型的なパフォーマンスは、約 1,000,000 行で 10 秒未満です (もちろんシステムによって異なります)。インデックスにヒットすることは不可能であるため、パフォーマンスは比較的制限されることに注意してください。
大きなテーブルではTABLESAMPLE
、テーブル全体のスキャンを避けるためにこれを使用することもできます。
SELECT TOP 1 *
FROM YourTable
TABLESAMPLE (1000 ROWS)
ORDER BY NEWID()
ORDER BY NEWID
データ ページで最初に表示される行だけを返すことを避けるために、 は依然として必要です。
使用する数は、テーブルのサイズと定義に合わせて慎重に選択する必要があり、行が返されない場合は再試行ロジックを検討できます。この背後にある計算と、この手法が小さなテーブルに適していない理由については、こちらで説明しています。
また、MIN(Id) と MAX(Id) の間のランダムな ID を取得する方法を試してから、
SELECT TOP 1 * FROM table WHERE Id >= @yourrandomid
常に1行取得されます。