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

问题描述:

This question询问在SQL Server上获得随机(ish)记录样本,答案是使用TABLESAMPLE。 Oracle 10中是否有等价物?从查询结果中选择结果的随机样本

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

+4

此时,@grokster比被检查的答案要好。 – 2013-09-06 12:46:05

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

有点慢,但做的工作,谢谢。 – 2009-04-09 10:56:14

+13

DBMS_RANDOM是PL/SQL,在Oracle中没有用于生成随机数的纯SQL方式。所有冰雹上下文切换。 – Quassnoi 2009-04-09 11:00:19

还有一个特殊的样品子句选择的百分比:http://oracleact.com/papers/sampleclause.html

+1

这适用于表格,但@op要求提供“查询集合”,并且样本不适用于查询集合,仅适用于连接中的单个表格。然而,+1为参考。 – Quassnoi 2009-04-09 11:24:34

+0

其实这更适合我的需求。看起来它可以用于oracle 10中的多个表,但是Quassnoi的解决方案做了我所需要的并且在几分钟内做出了响应,因此他保持打勾:) – 2009-04-09 15:51:03

像这样的东西应该工作:

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); 

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 

我们给予和分配给了一个多星期的等跨度选择的agents..ie 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; 

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

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) 

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

SELECT * FROM TABLE_NAME SAMPLE(50); 

这里50是表中数据的百分比。所以,如果你想从100000 1000行。你可以执行一个查询,如: -

SELECT * FROM TABLE_NAME SAMPLE(1); 

希望这可以帮助你。

SELECT * FROM TABLE_NAME SAMPLE(1) 

会给你olny约1%的份额,而不是观察次数的1/100。可能的原因是Oracle为每个观察生成一个随机标记,以确定是否包含在样本中。在这样一个生成过程中的论点1(1%)将每个观察值的概率选入样本。

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

我知道这已经回答了,但在这里看到这么多的访问我想补充一点,使用样本条款,但仍允许先过滤行一个版本:但是

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

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