2008-09-09 9 views
32

Jaki jest najlepszy sposób sortowania wyników kwerendy sql w kolejności losowej w procedurze przechowywanej?Sortowanie losowe serwera SQL

+2

możliwe duplikat [Jak zwrócić losowe wiersza w SQL?] (Http://stackoverflow.com/questions/19412/how-to-request-a-random-row-in-sql) – exhuma

Odpowiedz

55

To jest duplikat SO# 19412. Oto odpowiedź dałem tam:

select top 1 * from mytable order by newid() 

W SQL Server 2005 iw górę, można użyć TABLESAMPLE dostać losową próbkę, która jest powtarzalna:

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

Chociaż nie jest to najlepsza odpowiedź na inne pytanie związane z: http://stackoverflow.com/questions/19412/how-to-request-a-randomflow-in-sql –

+0

To pytanie nie jest dokładnym duplikatem SO # 19412, który prosi o losowy wiersz z zapytania, nawet jeśli jest to zaznaczone jako odpowiedź, ponieważ daje to tylko 1 wiersz, a nie wyniki losowego sortowania zapytania. –

+0

Wskazówka TABLESAMPLE jest złota! – Kong

14
select foo from Bar order by newid() 
4

Nie można po prostu zamówić RAND(), jak wiadomo, ponieważ wygeneruje tylko jedną wartość. Tak więc użyj klucza do wartości początkowej.

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

też użyć następującej kwerendy, która zwraca się lepszym losowy wynik próbki:

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

0,01 oznacza ~ 1 procent wszystkich wierszy.

Cytat SQL 2008 Books Online:

Jeśli naprawdę chcesz losową próbkę poszczególnych rzędach, zmodyfikować zapytanie do odfiltrować wiersze losowo zamiast użyciu TABLESAMPLE.

+2

To działa wolniej niż TABLESAMPLE i jest szybsze niż ORDER BY NEWID() na dużym stole. – endo64

+0

Gdy szukałem losowego próbkowania z wyników zapytania, to konkretne rozwiązanie dało mi to, czego szukałem, chociaż odpowiedź Harpo zamawiałaby losowo wyniki. –