web-dev-qa-db-ja.com

クエリ結果から結果のランダムサンプルを選択する

この質問 は、SQL Server上のレコードのランダム(ish)サンプルの取得について尋ね、答えはTABLESAMPLEを使用することでした。 Oracle 10に同等のものはありますか?

存在しない場合、クエリセットから結果のランダムサンプルを取得する標準的な方法はありますか?たとえば、通常は数百万を返すクエリから1,000のランダムな行を取得するにはどうすればよいですか?

57
Jeremy French
SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        ORDER BY
                dbms_random.value
        )
WHERE rownum <= 1000
70
Quassnoi

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
62
grokster

これは完璧な答えではありませんが、パフォーマンスが大幅に向上します。

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)
12
SELECT * FROM TABLE_NAME SAMPLE(1)

正確に1/100の観測数ではなく、おおよそ1%のシェアを提供します。考えられる理由は、Oracleが生成するサンプルに含めるかどうかに関して、各観測値に対してランダムフラグを生成するためです。このような生成プロセスの引数1(1%)は、各観測値がサンプルに選択される確率の役割を果たします。

これが当てはまる場合、サンプルサイズの実際の分布は二項になります。

6
Hors2force

サンプル関数は、Oracleのサンプルデータに使用されます。だからあなたはこのように試すことができます:-

SELECT * FROM TABLE_NAME SAMPLE(50);

ここで、50はテーブルに含まれるデータの割合です。したがって、100000から1000行が必要な場合は、次のようなクエリを実行できます。

SELECT * FROM TABLE_NAME SAMPLE(1);

これがあなたのお役に立てば幸いです。

3
Ankit Bajpai

私はこれがすでに回答されていることを知っていますが、ここで非常に多くの訪問を見ているので、SAMPLE句を使用するが、行を最初にフィルタリングできるバージョンを追加したいと思います:

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

ただし、基本選択にはROWID列が必要であることに注意してください。これは、たとえば一部のビューでは機能しない可能性があることを意味します。

3

エージェントのリストから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;
0
ChrisNZak

このような何かが動作するはずです:

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 );
0
BASMA SHAWKY