http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#i2065953
但上面的参考仅讨论了用于创建示例的语法.我的问题的原因是我需要了解样本百分比如何确定返回的样本大小.似乎它将随机数应用于您要求的百分比,然后使用种子数来计算每个“n”个记录.我们的要求是我们提取一定数量的样本,例如,它们是随机选择的,并且它们代表整个表格(或者至少是我们用过滤器选择的数据分组)
如果我需要大约100个项目的样本,在10200个项目的人口中,我可以使用此声明:
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条记录的方法,这些记录是随机选择的,并且相当代表整个表格.请帮忙!!
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.倾斜本身似乎相当随机.我尝试使用块修饰符似乎没有什么区别,也许令人惊讶 – 我可能认为在这种情况下它会变得更糟.
对于小样本来说,这可能会更慢,因为它必须达到整个表格;但确实给我提供了相当一致的分裂:
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方法,如果您的数据传播以及您对“代表性”的要求需要分层版本.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。