Случайная выборка данных с оракулом sql, генерация данных - PullRequest
0 голосов
/ 16 октября 2018

Мне нужно сгенерировать некоторые данные выборки из популяции.Я хочу сделать это с помощью SQL-запроса к базе данных Oracle 11g.

Вот простой рабочий пример с размером популяции 4 и размером выборки 2:

with population as (
    select 1 as val from dual union all 
    select 2 from dual union all 
    select 3 from dual union all 
    select 4 from dual)

select val from (
    select val, dbms_random.value(0,10) AS RANDORDER 
    from  population 
    order by randorder) 
where rownum <= 2

(пример оракула () функция не работает в связи с предложением WITH для меня)

Но теперь я хочу «увеличить масштаб» или умножить мои данные выборки.Так что я могу получить что-то вроде 150% данных выборки данных о населении (например, размер населения 4 и размер выборки 6)

Есть ли хороший способ добиться этого с помощью SQL-запроса?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Решение зависит, если вы хотите, чтобы все строки из первого начального набора (-ов) и случайные дополнительные строки из последнего, использовали:

with params(size_, sample_) as (select 4, 6 from dual)
select val 
  from (
    select mod(level - 1, size_) + 1 val, sample_,
           case when level <= size_ * floor(sample_ / size_) then 0 
                else dbms_random.value() 
           end rand
      from params
      connect by level <= size_ * ceil(sample_ / size_)
      order by rand)
  where rownum <= sample_

Но если вы разрешите возможность результата, например (1, 1, 2, 2, 3, 3), где некоторые значения могут вообще не отображаться в выводе (здесь 4), тогда используйте это:

with params(size_, sample_) as (select 4, 6 from dual)
select val 
  from (
    select mod(level - 1, size_) + 1 val, sample_, dbms_random.value() rand
      from params
      connect by level <= size_ * ceil(sample_ / size_)
      order by rand)
  where rownum <= sample_

Как это работает?Мы строим множество (1, 2, 3, 4) столько раз, сколько это получается в результате деления sample / size.Затем мы назначаем случайные значения.В первом случае я назначаю 0 первому набору (ям), чтобы они точно были на выходе, а случайные значения - последнему наборуВо втором случае случайности назначаются всем строкам.

0 голосов
/ 16 октября 2018

Вы можете использовать CONNECT BY:

with population(val, RANDOMORDER) as (
    select level, dbms_random.value(0,10) AS RANDORDER 
    from dual
    connect by level <= 6
    ORDER BY RANDORDER
)
select val
FROM population
WHERE rownum <= 4;

db <> fiddle demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...