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

Jer*_*nch 57 sql oracle random-sample

这个问题询问在SQL Server上获取随机(ish)记录样本并且答案是要使用TABLESAMPLE.Oracle 10中是否有相同的功能?

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

Qua*_*noi 70

SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        ORDER BY
                dbms_random.value
        )
WHERE rownum <= 1000
Run Code Online (Sandbox Code Playgroud)

  • DBMS_RANDOM是PL/SQL,Oracle中没有纯SQL方法来生成随机数.所有冰雹情境切换. (14认同)
  • 有点慢,但做的工作,谢谢. (3认同)

gro*_*ter 62

样本条款会给你表中的所有行的随机抽样百分比.

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

SELECT * FROM emp SAMPLE(25)
Run Code Online (Sandbox Code Playgroud)

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

在这里,我们每个样本10个:

SELECT * FROM (
SELECT job, sal, ROW_NUMBER()
OVER (
PARTITION BY job ORDER BY job
) SampleCount FROM emp
)
WHERE SampleCount <= 10
Run Code Online (Sandbox Code Playgroud)

  • 大多数时候我们没有得到 25% 的行。相反,我们得到一些不确定的行数。并且我们原始集合中的每一行都有相同的机会(此处为 ¼)被选中。 (3认同)
  • “SEED(n)”选项允许您始终获得相同的样本,因此具有相同的行数(当您需要可重现的结果时这可能很有用),例如“SELECT * from emp SAMPLE(25) SEED(1)” 。 (3认同)

Art*_*dez 12

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

SELECT  *
FROM    (
    SELECT  *
    FROM    mytable sample (0.01)
    ORDER BY
            dbms_random.value
    )
WHERE rownum <= 1000
Run Code Online (Sandbox Code Playgroud)

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

select * from mytable sample (0.01)
Run Code Online (Sandbox Code Playgroud)

  • 如果样本在统计上是无偏的,这不是一个好方法.由于内部查询的结果是有序的,因此第一个值的选择机会比后者更大.想象一下,挑选表的最后一个寄存器是多么不可能! (3认同)

Ank*_*pai 7

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

SELECT * FROM TABLE_NAME SAMPLE(50);
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM TABLE_NAME SAMPLE(1);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮到你。


Tho*_*ich 7

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

with cte1 as (
    select *
    from t_your_table
    where your_column = 'ABC'
)
select * from cte1 sample (5)
Run Code Online (Sandbox Code Playgroud)

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


小智 6

SELECT * FROM TABLE_NAME SAMPLE(1)
Run Code Online (Sandbox Code Playgroud)

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

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