我试图从仁科数据库拉人口的随机样本。 的在线搜索都使我觉得select语句的样本条款可能对我们使用一种可行的选择,但我无法理解的样本条款如何确定返回的样本数量。 我已经看了看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'示例表,我看到完全一样的东西(在11gR2中的OEL开发商图像),通常获得价值为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
这似乎使相差不大,也许令人惊讶的修改-我可能已经想到会在这种情况变得更糟。
这很可能要慢一些,当然对于小样本量,因为它击中整个表; 但确实给我漂亮,甚至分裂相当一致:
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
......这看起来健康一点。 当然情况因人而异。
这个甲骨文文章介绍了一些采样技术,你可能要评估ora_hash
方法,以及,分层版本,如果您的数据传播和关于“代表性”要求需要它。
你不能相信SAMPLE
从表中返回一个真正的随机组行。 该算法似乎是基于表的物理性质。
create table test1(a number, b char(2000));
--Insert 10K fat records. A is always 1.
insert into test1 select 1, level from dual connect by level <= 10000;
--Insert 10K skinny records. A is always 2.
insert into test1 select 2, null from dual connect by level <= 10000;
--Select about 10 rows.
select * from test1 sample (0.1) order by a;
上次运行的查询多次,你将几乎从来没有看到任何2S。 如果你衡量字节,但不排这可能是一个准确的样本。
这是歪斜的数据的一个极端的例子,但我认为这足以表明, RANDOM
不工作手册暗示的方式应该。 正如其他人所建议的,你可能会想ORDER BY DBMS_RANDOM.VALUE
。
我一直在摆弄一个类似的问题。 首先,我设置了样本量会是怎样的不同阶层。 在你的情况下,它是唯一一个。 ( '700064')。 因此,在与子句或临时表我这样做:
Select DEPTID, Count(*) SAMPLE_ONE
FROM PS_LEDGER Sample(1)
WHERE DEPTID = '700064'
Group By DEPTID
这告诉你1%的样本预期的记录。 让我们称之为TABLE_1
然后,我这样做:
Select
Ceil (Rank() over (Partition by DEPTID Order by DBMS_RANDOM.VALUE)
/ (Select SAMPLE_ONE From TABLE_1) STRATUM_GROUP
,A.*
FROM PS_LEDGER
作出这样的另一个表。 你得到的,然后是约的随机样本集。 尺寸为1%。
所以,如果您的原始表中保存1000条记录,你会得到100点随机样本集合,在每组10个项目。
那么你可以选择其中一个随机测试。
不知道如果我已经解释这很好,但它为我工作。 我有168地层设置在表上有超过10MIL记录相当奏效。
如果您想了解更多的解释,也可以改善这种请不要犹豫。
问候