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)
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)
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)
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)
希望这可以帮到你。
我知道这已经得到了回答,但是在这里看到如此多的访问,我想添加一个使用 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%)承担了将每个观察值选择到样本中的概率的作用。
如果是这样,则样本大小的实际分布将是二项式的。
归档时间: |
|
查看次数: |
170749 次 |
最近记录: |