1. ホーム
  2. sql-server

[解決済み] データベースのテーブルからランダムなレコードを取得する (T-SQL)

2023-02-19 14:23:06

質問

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

私はユニットテストデータをランダムにしたいので、テーブルからランダムなidを選択する簡単な方法を探しています。 英語では、selectは"Select one id from the table which the id is a random number between the lowest id in the table and the highest id in the table.".となります。

クエリを実行し、NULL値をテストし、NULLの場合に再実行することなく、これを行う方法を見つけることができません。

アイデアはありますか?

どのように解決するのですか?

<ブロッククオート

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

はい、あります。

SELECT TOP 1 * FROM table ORDER BY NEWID()

説明

A NEWID() が各行に対して生成され、それによってテーブルがソートされます。最初のレコードが返されます(つまり、"lowest" GUIDを持つレコードです)。

注意事項

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

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

    アルゴリズムは以下の通りです。

    • の最上位ビット2つ(ビット6とビット7)をそれぞれ0と1に設定します。 clock_seq_hi_and_reserved の最上位ビット 2 つ(ビット 6 とビット 7)をそれぞれ 0 と 1 に設定します。
    • time_hi_and_versionフィールドの最上位4ビット(ビット12~15)を、それぞれ0と1に設定します。 の4ビットのバージョン番号に設定する。 4.1.3節を参照してください。
    • 他のすべてのビットをランダムに(または擬似的に)選択された値に設定する。 値を設定します。

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

  2. 代替案 SELECT TOP 1 * FROM table ORDER BY RAND() は思ったようにはいきません。 RAND() はクエリごとに一つの値を返すので、すべての行が同じ値を共有することになります。

  3. GUID値は擬似ランダムですが、より要求の厳しいアプリケーションでは、より良いPRNGが必要になるでしょう。

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