69

这个问题询问有关在 SQL Server 上获取随机(ish)记录样本的问题,答案是使用TABLESAMPLE. Oracle 10 中是否有等价物?

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

4

9 回答 9

84
SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        ORDER BY
                dbms_random.value
        )
WHERE rownum <= 1000
于 2009-04-09T10:35:32.010 回答
76

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
于 2012-09-19T20:11:09.553 回答
15

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

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

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

select * from mytable sample (0.01)
于 2013-08-26T16:50:33.730 回答
8
SELECT * FROM TABLE_NAME SAMPLE(1)

会给你 olny 大约 1% 的份额,而不是正好 1/100 的观察次数。可能的原因是 Oracle 会为每个观察生成一个随机标志,以确定是否包含在它生成的样本中。在这样的生成过程中,参数 1 (1%) 扮演了每个观察被选入样本的概率的角色。

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

于 2015-02-19T10:59:28.540 回答
7

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

SELECT * FROM TABLE_NAME SAMPLE(50);

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

SELECT * FROM TABLE_NAME SAMPLE(1);

希望这可以帮到你。

于 2014-06-25T09:32:17.970 回答
7

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

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

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

于 2016-08-23T12:08:07.950 回答
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 );
于 2012-04-30T09:42:50.013 回答
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;
于 2013-05-01T19:57:26.720 回答
0

假设您正试图从名为my_table. 这是一种方法:

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

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

于 2021-02-03T16:55:48.170 回答