从查询结果中选择结果的随机样本

时间:2009-04-09 10:33:23

标签: sql oracle random-sample

This question询问如何在SQL Server上获取随机(ish)记录样本,答案是使用TABLESAMPLE。在Oracle 10中是否存在等价物?

如果没有,是否有标准方法从查询集中获取结果的随机样本?例如,如何从一个通常会返回数百万的查询中获得1,000个随机行?

9 个答案:

答案 0 :(得分:68)

SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        ORDER BY
                dbms_random.value
        )
WHERE rownum <= 1000

答案 1 :(得分:62)

SAMPLE clause将为您提供表格中所有行的随机抽样百分比。

例如,这里我们获得了25%的行:

SELECT * FROM emp SAMPLE(25)

以下SQL(使用其中一个分析函数)将为您提供表中特定值(类似于GROUP BY)每次出现的特定数量的随机样本。

这里我们每个样本10个:

SELECT * FROM (
SELECT job, sal, ROW_NUMBER()
OVER (
PARTITION BY job ORDER BY job
) SampleCount FROM emp
)
WHERE SampleCount <= 10

答案 2 :(得分:11)

这不是一个完美的答案,但会得到更好的表现。

SELECT  *
FROM    (
    SELECT  *
    FROM    mytable sample (0.01)
    ORDER BY
            dbms_random.value
    )
WHERE rownum <= 1000

示例将为您提供实际表格的百分比,如果您真的想要1000行,则需要调整该数字。更常见的是,我只需要任意数量的行,所以我不限制我的结果。在我的数据库中有200万行,我得到2秒对60秒。

select * from mytable sample (0.01)

答案 3 :(得分:6)

SELECT * FROM TABLE_NAME SAMPLE(1)

将为您提供约1%的份额,而不是观察数量的1/100。可能的原因是Oracle为每个观察生成一个随机标志,以确定它是否包含在它生成的样本中。在这样的生成过程中,参数1(1%)承担了每个观察被选择到样本中的概率的作用。

如果是这样,样本大小的实际分布将是二项式。

答案 4 :(得分:3)

示例函数用于 ORACLE 中的示例数据。所以你可以尝试这样: -

SELECT * FROM TABLE_NAME SAMPLE(50);

这里50是表中包含的数据百分比。因此,如果您想要100000行中的1000行。您可以执行以下查询:

SELECT * FROM TABLE_NAME SAMPLE(1);

希望这可以帮到你。

答案 5 :(得分:2)

我知道这已经得到了解答,但是在这里看到这么多次访问我想添加一个使用SAMPLE子句但仍允许首先过滤行的版本:

with cte1 as (
    select *
    from t_your_table
    where your_column = 'ABC'
)
select * from cte1 sample (5)

但请注意,基本选择需要ROWID列,这意味着它可能不适用于某些视图。

答案 6 :(得分:0)

这样的事情应该有效:

SELECT * 
FROM table_name
WHERE primary_key IN (SELECT primary_key 
                      FROM
                      (
                        SELECT primary_key, SYS.DBMS_RANDOM.RANDOM 
                        FROM table_name 
                        ORDER BY 2
                      )
                      WHERE rownum <= 10 );

答案 7 :(得分:0)

我们被给予并指定从代理商列表中仅选择两个记录..在一周的时间内每个代理商的2个随机记录等......以下是我们得到的并且它有效

with summary as (
Select Dbms_Random.Random As Ran_Number,
             colmn1,
             colm2,
             colm3
             Row_Number() Over(Partition By col2 Order By Dbms_Random.Random) As Rank
    From table1, table2
 Where Table1.Id = Table2.Id
 Order By Dbms_Random.Random Asc)
Select tab1.col2,
             tab1.col4,
             tab1.col5,
    From Summary s
 Where s.Rank <= 2;

答案 8 :(得分:0)

假设您正试图从名为 my_table 的表中随机选择 1,000 行。这是一种方法:

select
    *
from
    (
        select
            row_number() over(order by dbms_random.value) as random_id,
            x.*
        from
            my_table x
    )
where
    random_id <= 1000
;

这与@Quassnoi 发布的答案略有不同。它们都具有相同的成本和执行时间。唯一的区别是您可以选择用于获取样本的随机数。