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

Sql 从查询结果中选择结果的随机样本,sql,oracle,random-sample,Sql,Oracle,Random Sample,询问如何在SQL Server上获取随机记录样本,答案是使用TABLESAMPLE。Oracle 10中是否有类似的版本 如果没有,是否有标准的方法从查询集中获取结果的随机样本?例如,如何从一个正常返回数百万的查询中获得1000个随机行 SELECT * FROM ( SELECT * FROM mytable ORDER BY dbms_random.value ) WHERE ro

询问如何在SQL Server上获取随机记录样本,答案是使用TABLESAMPLE。Oracle 10中是否有类似的版本


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

SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        ORDER BY
                dbms_random.value
        )
WHERE rownum <= 1000
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 );
将为您提供表中所有行的随机抽样百分比

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

我们被分配从代理列表中只选择两个记录,即每个代理在一周内随机选择两个记录等。。。。下面是我们得到的,它是有效的

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

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

SELECT * FROM TABLE_NAME SAMPLE(50);
这里50是表中包含的数据百分比。所以如果你想从100000行中减去1000行。您可以执行如下查询:

SELECT * FROM TABLE_NAME SAMPLE(1);
希望这能帮助你

SELECT * FROM TABLE_NAME SAMPLE(1)
将给你奥尔尼一个大约1%的份额,而不是确切的观察数量的1/100。可能的原因是Oracle为每次观察生成一个随机标志,以确定是否包含在它生成的样本中。在这样一个生成过程中,参数1%扮演着每个观察被选入样本的概率的角色


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

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

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

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

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

选择 * 从…起 选择 按dbms\U random.value作为random\U id对行号进行排序, 十,* 从…起 我的桌子x 哪里
random_id DBMS_random是PL/SQL,Oracle中没有纯SQL方式来生成随机数。所有hail上下文切换。在具有40000行的表上,此查询需要0.1秒,而基于SAMPLEn的查询需要0.02秒,快5倍。因此,对于我的数据量来说,它并没有那么慢……我们在大多数情况下并没有获得25%的行。相反,我们得到了一些不确定的行数。原始集合中的每一行都有相同的被选择机会¼。SEEDn选项允许您始终获得相同的样本,因此相同的行数。当您需要可重复的结果时,这可能很有用,例如,从emp SAMPLE25 SEED1中选择*。使用一个包含40000行和SAMPLE25的表,我看到24.41%到25.36%的记录被返回。如果样本在统计上是无偏的,这不是一个好方法。因为内部查询的结果是有序的,所以第一个值比后一个值有更大的机会被拾取。试想一下,选择表格的最后一个寄存器是多么不可能!因为内部查询按未索引的值排序。db必须在返回第一行之前,一直计算到最后一行的值。因为它与任何其他记录一样可能首先被拾取。@Baumann:dbms_random.value是由数据库生成的随机值,因此,行不应被认为是真正有序的,只需使SAMPLEn选择的每一行在1000个返回行中具有相同的概率。第一个查询将两个世界中最好的快速随机选择与SAMPLEn结合起来,并将精确定义的返回结果数与rownumIn结合起来。我想在现有生产表创建一些真实的测试数据。通过调整样本大小,这正是我所需要的。
with cte1 as (
    select *
    from t_your_table
    where your_column = 'ABC'
)
select * from cte1 sample (5)