2012-03-26 5 views
44

Мне нужно выбирать строки случайным образом. Пример: предположим, что таблица состоит из 100 записей, но мне нужно получить только 20 записей из этих 100 записей, а выбор записи будет случайным образом. Как бы я вышел из него? Я использую oracle как мой db. любое предложение мне очень помогло бы. Заранее спасибо ..Как получить случайные данные из базы данных оракула?

ответ

68
SELECT * 
FROM (
    SELECT * 
    FROM table 
    ORDER BY DBMS_RANDOM.VALUE) 
WHERE rownum < 21; 
+6

Должно ли это быть 'DBMS_RANDOM.VALUE'? – Filburt

+0

Это тоже работает. – cagcowboy

+1

Ударьте меня в это. Это, однако, будет выбирать только первые 20 строк из таблицы и упорядочивать их случайным образом. –

6
SELECT column FROM 
(SELECT column, dbms_random.value FROM table ORDER BY 2) 
where rownum <= 20; 
3

Чтобы случайно выбрать 20 строк, я думаю, вы бы лучше выбрать их много случайным образом упорядоченный и выбирая первые 20 из этого набора.

Что-то вроде:

Select * 
    from (select * 
      from table 
     order by dbms_random.value) -- you can also use DBMS_RANDOM.RANDOM 
where rownum < 21; 

Лучше всего использовать для небольших таблиц, чтобы избежать выбора больших объемов данных только отбросить большинство из них.

28

SAMPLE() не гарантировано дать вам ровно 20 строк, но может быть приемлемым (и может выполнять значительно лучше, чем полный запрос + сортировки по случайным для больших таблиц):

SELECT * 
FROM table SAMPLE(20); 

Примечание : 20 здесь приблизительный процент, а не количество требуемых строк. В этом случае, поскольку у вас есть 100 строк, чтобы получить приблизительно 20 строк, вы запрашиваете 20% выборку.

+1

образец быстрый, но не кажется очень случайным. записи к началу/началу таблицы, как правило, предпочтительнее. – craigrs84

+1

, что произойдет, если вы остановите запрос до того, как он пройдет через всю таблицу. –

+1

Извините, я сделал ошибку, ваше сообщение в порядке и результаты в равной степени распределены. Это когда вы добавляете «где rownum <= 20» в сочетании с образцом (20), что данные начинают становиться менее случайными. – craigrs84

9
SELECT * FROM table SAMPLE(10) WHERE ROWNUM <= 20; 

Это более эффективно, так как ему не нужно сортировать таблицу.

+5

Остановка образца после 20 строк приведет к неслучайным результатам (строки, найденные ранее в таблице, будут возвращаться гораздо чаще, чем более поздние). Кроме того, это не гарантирует возврата 20 строк. –