SQL Serverでランダムに行を抽出する
SQL Serverでは、ORDER BYでNEWID()を使うと、行をランダムな順序に並べ替えることができます。TOP 10のように指定すれば、その行数分だけをランダムに取得できます。
SELECT TOP 10 * FROM SomeTable ORDER BY NEWID();
ただし、行数の多いテーブルに対してこの方法を使うと、処理コストが高くなります。全行に対してランダムな値を生成し、その結果を並べ替える必要があるためです。
このような場合は、TABLESAMPLEを使うことで、ある程度処理コストを抑えられます。ただし、TABLESAMPLEはページ単位でデータを取得するため、行単位で完全にランダムに抽出されるわけではありません。また、指定した行数が必ず取得されるとは限りません。
そのため、実際に取得したい行数よりも多めに候補を取得し、その候補に対してORDER BY NEWID()を使う方法が考えられます。
WITH candidates AS (
SELECT *
FROM SomeTable TABLESAMPLE (1000 ROWS)
)
SELECT TOP 10 *
FROM candidates
ORDER BY NEWID();
この方法であれば、全件を並べ替える場合に比べて処理コストを抑えつつ、ランダムに近い抽出ができます。
NEWID(Transact-SQL) - SQL Server | Microsoft Learn
HM
