我正在尝试从 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/