Выберите случайную выборку результатов из результата запроса
этот вопрос задает вопрос о получении случайного (ish) образца записей на SQL Server, и ответ должен был использовать TABLESAMPLE. Есть ли эквивалент в Oracle 10?
если нет, есть ли стандартный способ получить случайную выборку результатов из запроса? Например, как можно получить 1000 случайных строк из запроса, который обычно возвращает миллионы?
8 ответов:
The пример предложения даст вам случайный процент выборки всех строк в таблице.
например, здесь мы получаем 25% строк:
SELECT * FROM emp SAMPLE(25)следующий SQL (с использованием одной из аналитических функций) даст вам случайную выборку определенного числа каждого вхождения определенного значения (аналогичного группе BY) в таблице.
здесь мы пробуем 10 из каждого:
SELECT * FROM ( SELECT job, sal, ROW_NUMBER() OVER ( PARTITION BY job ORDER BY job ) SampleCount FROM emp ) WHERE SampleCount <= 10
это не идеальный ответ, но получите гораздо лучшую производительность.
SELECT * FROM ( SELECT * FROM mytable sample (0.01) ORDER BY dbms_random.value ) WHERE rownum <= 1000образец даст вам процент от вашей фактической таблицы, если вы действительно хотите 1000 строк, вам нужно будет настроить это число. Чаще всего мне просто нужно произвольное количество строк в любом случае, поэтому я не ограничиваю свои результаты. В моей базе данных с 2 миллионами строк я получаю 2 секунды против 60 секунд.
select * from mytable sample (0.01)
SELECT * FROM TABLE_NAME SAMPLE(1)даст вам olny приблизительную долю 1%, а не точно 1/100 от числа наблюдений. Вероятная причина заключается в том, что Oracle генерирует случайный флаг для каждого наблюдения относительно того, входит ли он в выборку, которую он генерирует. Аргумент 1 (1%) в таком процессе генерации играет роль вероятности отбора каждого наблюдения в выборку.
если это верно, то фактическое распределение размеров выборки будет биномиальным.
Я знаю, что на это уже ответили, но, видя так много посещений здесь, я хотел бы добавить одну версию, которая использует предложение SAMPLE, но все же позволяет сначала фильтровать строки:
with cte1 as ( select * from t_your_table where your_column = 'ABC' ) select * from cte1 sample (5)обратите внимание, однако, что базовый выбор нуждается в
функция Sample используется для выборки данных в ORACLE. Так что вы можете попробовать вот так: -
SELECT * FROM TABLE_NAME SAMPLE(50);здесь 50-это процент данных, содержащихся в таблице. Так что если вы хотите 1000 строк из 100000. Вы можете выполнить запрос типа: -
SELECT * FROM TABLE_NAME SAMPLE(1);надеюсь, это может помочь вам.
что-то вроде этого должно работать:
SELECT * FROM table_name WHERE primary_key IN (SELECT primary_key FROM ( SELECT primary_key, SYS.DBMS_RANDOM.RANDOM FROM table_name ORDER BY 2 ) WHERE rownum <= 10 );
нам дали задание выбрать только две записи из списка агентов..т. е. 2 случайные записи для каждого агента в течение недели и т. д.... и ниже то, что мы получили, и это работает
with summary as ( Select Dbms_Random.Random As Ran_Number, colmn1, colm2, colm3 Row_Number() Over(Partition By col2 Order By Dbms_Random.Random) As Rank From table1, table2 Where Table1.Id = Table2.Id Order By Dbms_Random.Random Asc) Select tab1.col2, tab1.col4, tab1.col5, From Summary s Where s.Rank <= 2;
Comments