Подтвердить что ты не робот

Выберите случайную выборку результатов из результата запроса

Этот вопрос просит о получении случайного (ish) образца записей на SQL Server, и ответ должен был использовать TABLESAMPLE. Есть ли эквивалент в Oracle 10?

Если этого не происходит, существует ли стандартный способ получения случайной выборки результатов из набора запросов? Например, как можно получить 1000 случайных строк из запроса, который обычно возвращает миллионы?

4b9b3361

Ответ 1

SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        ORDER BY
                dbms_random.value
        )
WHERE rownum <= 1000

Ответ 2

Предложение SAMPLE даст вам случайный образец процента всех строк в таблице.

Например, здесь мы получаем 25% строк:

SELECT * FROM emp SAMPLE(25)

Следующий SQL (с использованием одной из аналитических функций) даст вам случайную выборку определенного числа каждого вхождения определенного значения (аналогичного GROUP BY) в таблице.

Здесь мы выбираем 10 из них:

SELECT * FROM (
SELECT job, sal, ROW_NUMBER()
OVER (
PARTITION BY job ORDER BY job
) SampleCount FROM emp
)
WHERE SampleCount <= 10

Ответ 3

Это не идеальный ответ, но будет намного лучше.

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)

Ответ 5

SELECT * FROM TABLE_NAME SAMPLE(1)

Дает вам долю около 1%, а не 1/100 числа наблюдений. Вероятная причина заключается в том, что Oracle генерирует случайный флаг для каждого наблюдения относительно того, включать ли в образец, который он генерирует. Аргумент 1 (1%) в таком процессе генерации играет роль вероятности выбора каждого наблюдения в выборке.

Если это так, фактическое распределение размеров выборок будет биномиальным.

Ответ 6

Я знаю, что это уже ответили, но, увидев так много посещений, я хотел бы добавить одну версию, которая использует предложение SAMPLE, но все же позволяет сначала фильтровать строки:

with cte1 as (
    select *
    from t_your_table
    where your_column = 'ABC'
)
select * from cte1 sample (5)

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

Ответ 7

Функция Sample используется для данных образца в ORACLE. Поэтому вы можете попробовать следующее: -

SELECT * FROM TABLE_NAME SAMPLE(50);

Здесь 50 - процент данных, содержащихся в таблице. Поэтому, если вы хотите 1000 строк из 100000. Вы можете выполнить запрос, например: -

SELECT * FROM TABLE_NAME SAMPLE(1);

Надеюсь, это поможет вам.

Ответ 8

Что-то вроде этого должно работать:

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 );

Ответ 9

Нам было дано задание выбрать только две записи из списка агентов. 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;