Как лучше всего отсортировать результаты sql-запроса в случайном порядке внутри хранимой процедуры?





select foo from Bar order by newid()
Вы не можете просто ORDER BY RAND (), как вы знаете, потому что он генерирует только одно значение. Поэтому используйте ключ для начального значения.
SELECT RAND(object_id), object_id, name FROM sys.objects ORDER BY 1
Это дубликат SO # 19412. Вот ответ, который я там дал:
select top 1 * from mytable order by newid()
В SQL Server 2005 и более поздних версиях вы можете использовать TABLESAMPLE для получения повторяемой случайной выборки:
SELECT FirstName, LastName FROM Contact TABLESAMPLE (1 ROWS) ;
Хотя это не лучший ответ согласно другому вопросу, связанному с: stackoverflow.com/questions/19412/…
Этот вопрос не является точной копией SO # 19412, который запрашивает случайную строку из запроса, даже если он отмечен как ответ, поскольку это дает только 1 строку, а не результаты запроса, отсортированные случайным образом.
Наконечник TABLESAMPLE золотой!
Фактически, это вообще не отвечает на вопрос как просили. Поскольку спрашивающий отметил это как лучший ответ, похоже, что у него возникли проблемы с формулировкой своего фактического вопроса, но это не меняет того факта, что заданный вопрос: «Как мне случайным образом отсортировать все строк, возвращаемых моим запросом. ", в то время как в этом ответе говорится" вот как вернуть одну случайную строку из таблицы ".
TABLESAMPLE работает только для локальной таблицы. Для общего запроса вам придется полагаться на другую конструкцию.
Или используйте следующий запрос, который возвращает лучший результат случайной выборки:
SELECT * FROM a_table WHERE 0.01 >= CAST(CHECKSUM(NEWID(), a_column) & 0x7fffffff AS float) / CAST (0x7fffffff AS int)
0,01 означает ~ 1 процент от общего числа строк.
Цитата из электронной документации по SQL 2008:
If you really want a random sample of individual rows, modify your query to filter out rows randomly, instead of using TABLESAMPLE.
Это работает медленнее, чем TABLESAMPLE, и быстрее, чем ORDER BY NEWID () для большой таблицы.
Поскольку я искал случайную выборку из результатов запроса, это конкретное решение дало мне то, что я искал, хотя ответ Харпо упорядочивал результаты случайным образом.
возможный дубликат Как запросить случайную строку в SQL?