Ответ 1
SELECT *
FROM (
SELECT *
FROM mytable
ORDER BY
dbms_random.value
)
WHERE rownum <= 1000
Этот вопрос просит о получении случайного (ish) образца записей на SQL Server, и ответ должен был использовать TABLESAMPLE
. Есть ли эквивалент в Oracle 10?
Если этого не происходит, существует ли стандартный способ получения случайной выборки результатов из набора запросов? Например, как можно получить 1000 случайных строк из запроса, который обычно возвращает миллионы?
SELECT *
FROM (
SELECT *
FROM mytable
ORDER BY
dbms_random.value
)
WHERE rownum <= 1000
Предложение 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
Это не идеальный ответ, но будет намного лучше.
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)
Существует также специальное предложение выборки для выбора процента: http://oracleact.com/papers/sampleclause.html
SELECT * FROM TABLE_NAME SAMPLE(1)
Дает вам долю около 1%, а не 1/100 числа наблюдений. Вероятная причина заключается в том, что Oracle генерирует случайный флаг для каждого наблюдения относительно того, включать ли в образец, который он генерирует. Аргумент 1 (1%) в таком процессе генерации играет роль вероятности выбора каждого наблюдения в выборке.
Если это так, фактическое распределение размеров выборок будет биномиальным.
Я знаю, что это уже ответили, но, увидев так много посещений, я хотел бы добавить одну версию, которая использует предложение SAMPLE, но все же позволяет сначала фильтровать строки:
with cte1 as (
select *
from t_your_table
where your_column = 'ABC'
)
select * from cte1 sample (5)
Обратите внимание, однако, что для выбора базы требуется столбец ROWID
, что означает, что он может не работать, например, для некоторых представлений.
Функция 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;