What is the best way to sort the results of a sql query into a random order within a stored procedure?
A:
You can't just ORDER BY RAND(), as you know, because it will only generate one value. So use a key for a seed value.
SELECT RAND(object_id), object_id, name FROM sys.objects ORDER BY 1
harpo
2008-09-09 21:36:40
+10
A:
This is a duplicate of SO# 19412. Here's the answer I gave there:
select top 1 * from mytable order by newid()
In SQL Server 2005 and up, you can use TABLESAMPLE to get a random sample that's repeatable:
SELECT FirstName, LastName FROM Contact TABLESAMPLE (1 ROWS) ;
Jon Galloway
2008-09-09 21:40:24
A:
Or use the following query, which returns a better random sample result:
SELECT * FROM a_table WHERE 0.01 >= CAST(CHECKSUM(NEWID(), a_column) & 0x7fffffff AS float) / CAST (0x7fffffff AS int)
0.01 means ~1 percent of total rows.
Quote from SQL 2008 Books Online:
If you really want a random sample of individual rows, modify your query to filter out rows randomly, instead of using TABLESAMPLE.
endo64
2010-10-15 12:54:50
This runs slower than TABLESAMPLE and faster than ORDER BY NEWID() on a big table.
endo64
2010-10-15 13:13:07