Как запросить случайную строку в SQL? - PullRequest
476 голосов
/ 21 августа 2008

Как я могу запросить случайную строку (или настолько близкую к действительно случайной, насколько это возможно) в чистом SQL?

Ответы [ 28 ]

0 голосов
/ 28 ноября 2016

Для Firebird:

Select FIRST 1 column from table ORDER BY RAND()
0 голосов
/ 03 сентября 2014

Существует лучшее решение для Oracle вместо использования dbms_random.value, в то время как для упорядочивания строк по dbms_random.value требуется полное сканирование, а для больших таблиц это довольно медленно.

Используйте это вместо:

SELECT *
FROM employee sample(1)
WHERE rownum=1
0 голосов
/ 18 декабря 2013

Простой и эффективный способ от http://akinas.com/pages/en/blog/mysql_random_row/

SET @i = (SELECT FLOOR(RAND() * COUNT(*)) FROM table); PREPARE get_stmt FROM 'SELECT * FROM table LIMIT ?, 1'; EXECUTE get_stmt USING @i;
0 голосов
/ 13 мая 2009

Будьте осторожны, поскольку TableSample на самом деле не возвращает случайную выборку строк. Он направляет ваш запрос на случайную выборку страниц размером 8 КБ, составляющих вашу строку. Затем ваш запрос выполняется по данным, содержащимся на этих страницах. Из-за того, как данные могут быть сгруппированы на этих страницах (порядок вставки и т. Д.), Это может привести к тому, что данные не будут случайной выборкой.

См .: http://www.mssqltips.com/tip.asp?tip=1308

Эта страница MSDN для TableSample содержит пример того, как сгенерировать действительно случайную выборку данных.

http://msdn.microsoft.com/en-us/library/ms189108.aspx

0 голосов
/ 21 августа 2008
 SELECT * FROM table ORDER BY RAND() LIMIT 1
0 голосов
/ 28 мая 2018

В SQL Server 2005 и более поздних версиях расширение ответа @ GreyPanther для случаев, когда num_value не имеет непрерывных значений. Это работает и в тех случаях, когда у нас нет равномерно распределенных наборов данных и когда num_value не число, а уникальный идентификатор.

WITH CTE_Table (SelRow, num_value) 
AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY ID) AS SelRow, num_value FROM table
) 

SELECT * FROM table Where num_value = ( 
    SELECT TOP 1 num_value FROM CTE_Table  WHERE SelRow >= RAND() * (SELECT MAX(SelRow) FROM CTE_Table)
)
0 голосов
/ 06 июля 2018

Случайная функция из SQL может помочь. Также, если вы хотите ограничиться только одной строкой, просто добавьте это в конце.

SELECT column FROM table
ORDER BY RAND()
LIMIT 1
0 голосов
/ 01 февраля 2011

Кажется, что многие из перечисленных идей все еще используют порядок

Однако, если вы используете временную таблицу, вы можете назначить случайный индекс (как предлагали многие решения), а затем получить первый, который больше произвольного числа в диапазоне от 0 до 1.

Например (для DB2):

WITH TEMP AS (
SELECT COMLUMN, RAND() AS IDX FROM TABLE)
SELECT COLUMN FROM TABLE WHERE IDX > .5
FETCH FIRST 1 ROW ONLY
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...