2008-09-09 2 views
32

SQLクエリの結果をストアドプロシージャ内のランダムな順序に並べ替える最も良い方法は何ですか?SQL Serverのランダムソート

+2

[SQLでランダムな行を要求する方法は?](http://stackoverflow.com/questions/19412/how-to-request-a-random-row-in-sql) – exhuma

答えて

55

これはSO# 19412の複製です。ここで私が与えた答えだ:

select top 1 * from mytable order by newid() 

SQL Server 2005では、最大、あなたは繰り返しだランダムなサンプルを取得するTABLESAMPLEを使用することができます。

SELECT FirstName, LastName FROM Contact TABLESAMPLE (1 ROWS) ; 
+0

これは、にリンクされている他の質問によると、最高の答えではありません:http://stackoverflow.com/questions/19412/how-to-request-a-random-row-in-sql –

+0

この質問は、これは答えとしてマークされているにもかかわらず、これはクエリの結果がランダムにソートされていないので1行しか与えないので、クエリからランダムな行を要求するSO#19412。 –

+0

TABLESAMPLEの先端は金です! – Kong

14
select foo from Bar order by newid() 
4

あなたが知っているように、ただ1つの値しか生成しないため、RAND()をORDER BYで行うことはできません。したがって、シード値にはキーを使用します。

 
SELECT RAND(object_id), object_id, name 
    FROM sys.objects 
ORDER BY 1 
7

またはそれ以上を返す次のクエリを使用しますランダムサンプルの結果:

SELECT * FROM a_table WHERE 0.01 >= CAST(CHECKSUM(NEWID(), a_column) & 0x7fffffff AS float)/CAST (0x7fffffff AS int) 

0.01は合計行の1%を意味します。 SQL 2008オンラインブックから

引用:あなたは本当に 個々の行のランダムなサンプルが必要な場合

、TABLESAMPLEを使用してランダムに フィルタアウト行にクエリを変更し、代わりに 。

+2

これは、TABLESAMPLEよりも遅く、大きい表のORDER BY NEWID()よりも高速に実行されます。 – endo64

+0

質問の結果から無作為抽出を探していたので、この特定の解決策は私が探していたものを私に与えましたが、harpoの答えは結果をランダムに並べ替えるでしょう。 –