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



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



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

687   8  

8 ответов:

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

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

    Ничего не найдено.