【问题标题】:Random data sampling with oracle sql, data generation使用 oracle sql 进行随机数据采样,数据生成
【发布时间】:2018-10-16 14:48:42
【问题描述】:

我需要从总体中生成一些样本数据。我想在 Oracle 11g 数据库上使用 SQL 查询来做到这一点。

这是一个简单的工作示例,人口规模为 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

(对我来说,oracle sample() 函数不能与 WITH 子句结合使用)

但现在,我想“升级”或增加我的样本数据。这样我就可以获得人口数据的 150% 样本数据(例如,人口规模 4 和样本规模 6)

有没有一种通过 SQL 查询实现此目的的好方法?

【问题讨论】:

  • 有点不寻常的请求 - 您可以只使用两次相同的输入,这是否是一种关闭?例如With population 2 as (select * from population union all select * from population)

标签: sql oracle sample data-generation population


【解决方案1】:

你可以使用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

【讨论】:

    【解决方案2】:

    解决方案取决于,如果您想要第一个初始集合中的所有行和最后一个中的随机附加行,请使用:

    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 分配给第一组,因此它们肯定会在输出中,并且随机值分配给最后一组。在第二种情况下,随机数被分配给所有行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      相关资源
      最近更新 更多