小さなテーブルからランダムに10%のサンプリングを選択しようとしています。RAND()関数を使用して、乱数が0.10未満の行を選択すると思いました。
SELECT * FROM SomeTable
WHERE SomeColumn='SomeCondition' AND
RAND() < 0.10
しかし、私はすぐにRAND()が常に同じ数を返すことを発見しました!このxkcdの漫画を思い出させます。
OK、問題ありません。RAND関数はシード値を取ります。このクエリは定期的に実行しますが、別の日に実行すると異なる結果が得られるようにしたいので、日付と一意の行IDの組み合わせをシードします。
SELECT * FROM SomeTable
WHERE SomeColumn='SomeCondition' AND
RAND(CAST(GETDATE) AS INTEGER) + RowID) < 0.10
まだ結果が出ません!RANDから返された乱数を表示すると、それらがすべて狭い範囲内にあることがわかります。RANDから乱数を取得するには、ランダムシードを使用する必要があるようです。そもそも乱数シードがあれば、乱数は必要ありません!
私はこの問題に関連する以前の議論を見てきました:
SQL ServerランダムソートSQL
でランダム行を要求するにはどうすればよいですか?
彼らは私を助けません。TABLESAMPLEはページレベルで機能します。これは大きなテーブルには最適ですが、小さなテーブルには適していません。WHERE句の前に適用されるようです。必要な行数が事前にわからないため、NEWIDを使用したTOPは機能しません。
誰かが解決策、または少なくともヒントを持っていますか?
編集:私の特定のケースで機能するソリューションを提供してくれたAlexCuseに感謝します。さて、より大きな質問に、RANDをどのように動作させるか?