この質問 は、SQL Server上のレコードのランダム(ish)サンプルの取得について尋ね、答えは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(分析関数の1つを使用)は、テーブル内の特定の値(GROUP BYに類似)の各出現の特定の数のランダムサンプルを提供します。
ここでは、それぞれ10個をサンプリングします。
SELECT * FROM (
SELECT job, sal, ROW_NUMBER()
OVER (
PARTITION BY job ORDER BY job
) SampleCount FROM emp
)
WHERE SampleCount <= 10
これは完璧な答えではありませんが、パフォーマンスが大幅に向上します。
SELECT *
FROM (
SELECT *
FROM mytable sample (0.01)
ORDER BY
dbms_random.value
)
WHERE rownum <= 1000
サンプルは実際のテーブルの割合を示します。本当に1000行が必要な場合は、その数を調整する必要があります。より頻繁に、とにかく任意の数の行が必要なだけなので、結果を制限しません。 200万行のデータベースでは、60秒に対して2秒になります。
select * from mytable sample (0.01)
SELECT * FROM TABLE_NAME SAMPLE(1)
正確に1/100の観測数ではなく、おおよそ1%のシェアを提供します。考えられる理由は、Oracleが生成するサンプルに含めるかどうかに関して、各観測値に対してランダムフラグを生成するためです。このような生成プロセスの引数1(1%)は、各観測値がサンプルに選択される確率の役割を果たします。
これが当てはまる場合、サンプルサイズの実際の分布は二項になります。
サンプル関数は、Oracleのサンプルデータに使用されます。だからあなたはこのように試すことができます:-
SELECT * FROM TABLE_NAME SAMPLE(50);
ここで、50はテーブルに含まれるデータの割合です。したがって、100000から1000行が必要な場合は、次のようなクエリを実行できます。
SELECT * FROM TABLE_NAME SAMPLE(1);
これがあなたのお役に立てば幸いです。
私はこれがすでに回答されていることを知っていますが、ここで非常に多くの訪問を見ているので、SAMPLE句を使用するが、行を最初にフィルタリングできるバージョンを追加したいと思います:
with cte1 as (
select *
from t_your_table
where your_column = 'ABC'
)
select * from cte1 sample (5)
ただし、基本選択にはROWID
列が必要であることに注意してください。これは、たとえば一部のビューでは機能しない可能性があることを意味します。
エージェントのリストから2つのレコードのみを選択するように割り当てられ、割り当てられました。つまり、1週間の期間にわたって各エージェントに対して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;
このような何かが動作するはずです:
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 );