从查询结果中select一个结果的随机样本

这个问题询问有关在SQL Server上获得一个随机(ISH)logging样本,答案是使用TABLESAMPLE 。 在Oracle 10中是否有一个等价物?

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

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

SAMPLE子句将为您提供表中所有行的随机样本百分比。

例如,在这里我们获得了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 

这不是一个完美的答案,但会获得更好的performance。

 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) 

还有一个特殊的示例条款来select一个百分比: http : //oracleact.com/papers/sampleclause.html

 SELECT * FROM TABLE_NAME SAMPLE(1) 

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

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

我知道这已经被回答,但看到这么多的访问这里我想添加一个版本,使用SAMPLE子句,但仍然允许首先筛选行:

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

但是请注意,base select需要一个ROWID列,这意味着它可能不适用于某些视图。

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

 SELECT * FROM TABLE_NAME SAMPLE(50); 

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

 SELECT * FROM TABLE_NAME SAMPLE(1); 

希望这可以帮到你。

像这样的东西应该工作:

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

我们被赋予和分配从代理商列表中只select两个logging..每个代理商在一个星期内的2个随机logging等…和以下是我们得到的和它的工作原理

 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;