oracle - 从 Oracle 采样,需要准确数量的结果(示例子句)

标签 oracle sample random

我正在尝试从 Peoplesoft 数据库中随机抽取总体样本。在线搜索使我认为 select 语句的 Sample 子句可能是我们使用的一个可行选项,但是我无法理解 Sample 子句如何确定返回的样本数量。我查看了这里找到的oracle文档: http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#i2065953

但是上面的引用文献仅讨论了用于创建示例的语法。我的问题的原因是我需要了解样本百分比如何确定返回的样本大小。看起来它会将随机数应用于您要求的百分比,然后使用种子数来计算每个“n”记录。我们的要求是,我们提取精确数量的样本,例如,它们是随机选择的,并且它们代表整个表(或至少代表我们使用过滤器选择的数据分组)

在 10200 个项目的总体中,如果我需要大约 100 个项目的样本,我可以使用以下语句:

SELECT * FROM PS_LEDGER SAMPLE(1) --1 % of my total population
WHERE DEPTID = '700064' 

但是,我们需要提取准确数量的样本(在本例中为 100),这样我就可以选择一个几乎总是返回超过我需要的数量的样本大小,然后将其缩小 IE

SELECT Count(*) FROM PS_LEDGER SAMPLE(2.5) --this percent must always give > 100 items
WHERE DEPTID = '700064' and rownum < 101

我担心这样做是我的样本不能统一代表整个人群。例如,如果示例函数在创建自己的随机生成的种子后仅提取每 N 条记录,则选择 rownum < 101 将截断从表底部选择的所有记录。我正在寻找一种从表中准确提取 100 条记录的方法,这些记录是随机选择的并且相当能代表整个表。请帮忙!!

最佳答案

借用 jonearles 的示例表,我看到了完全相同的情况(在 OEL 开发人员镜像上的 11gR2 中),通常获取的 a 值严重偏向于 1;对于小样本,有时我根本看不到。通过我在评论中提到的额外随机/限制步骤:

select a, count(*) from (
    select * from test1 sample (1)
    order by dbms_random.value
)
where rownum < 101
group by a;

...经过三轮运行,我得到了:

         A   COUNT(*)
---------- ----------
         1         71
         2         29

         A   COUNT(*)
---------- ----------
         1        100

         A   COUNT(*)
---------- ----------
         1         64
         2         36

是的,第二次运行时,100% 确实返回为 1。倾斜本身似乎相当随机。我尝试使用 block 修饰符,这似乎没有什么区别,也许令人惊讶 - 我可能认为在这种情况下情况会变得更糟。

这可能会更慢,尤其是对于小样本量,因为它必须覆盖整个表;但确实给了我相当均匀的 split :

select a, count(*) from (
    select a, b from (
        select a, b, row_number() over (order by dbms_random.value) as rn
        from test1
    )
    where rn < 101
)
group by a;

经过三轮运行,我得到:

         A   COUNT(*)
---------- ----------
         1         48
         2         52

         A   COUNT(*)
---------- ----------
         1         57
         2         43

         A   COUNT(*)
---------- ----------
         1         49
         2         51

...看起来更健康一点。当然是YMMV。

<小时/>

This Oracle article涵盖了一些采样技术,您可能还需要评估 ora_hash 方法,以及分层版本(如果您的数据传播和“代表性”要求需要它)。

关于oracle - 从 Oracle 采样,需要准确数量的结果(示例子句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16024737/

相关文章:

sql - 合并日期和时间并获取最新的日期时间

python - 密码中带有@符号的Oracle连接字符串

database - 示例星型模式数据集

MySQL按日期时间字段采样数据

java - 生成能被均分的数字

python - django.db.utils.DatabaseError : ORA-30673: column to be modified is not an identity column

oracle - 如何在Oracle中创建数据挖掘模型?

Excel VBA 获取不重复的随机整数值

python - Pandas 中数据帧子集的随机样本

java - 为数组中的每个对象绘制随机数并删除具有最低值的对象