从Oracle采样,极品结果的准确数量(样本条款)(Sampling from Oracle, Ne

2019-08-31 07:22发布

我试图从仁科数据库拉人口的随机样本。 的在线搜索都使我觉得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的记录,这是随机选取颇具代表性整个表的方式。 请帮忙!!

Answer 1:

借款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方法,以及,分层版本,如果您的数据传播和关于“代表性”要求需要它。



Answer 2:

你不能相信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



Answer 3:

我一直在摆弄一个类似的问题。 首先,我设置了样本量会是怎样的不同阶层。 在你的情况下,它是唯一一个。 ( '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记录相当奏效。

如果您想了解更多的解释,也可以改善这种请不要犹豫。

问候



文章来源: Sampling from Oracle, Need exact number of results (Sample Clause)