69

この質問は、SQL Server でランダムな (っぽい) レコードのサンプルを取得することについて尋ねたもので、答えは を使用することでした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 (分析関数の 1 つを使用) は、テーブル内の特定の値 (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

サンプルは、実際のテーブルの割合を示します。実際に 1000 行が必要な場合は、その数を調整する必要があります。多くの場合、とにかく任意の数の行が必要なだけなので、結果を制限しません。200 万行のデータベースでは、60 秒に対して 2 秒かかります。

select * from mytable sample (0.01)
于 2013-08-26T16:50:33.730 に答える
7

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

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

エージェントのリストから 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;
于 2013-05-01T19:57:26.720 に答える
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

というテーブルからちょうど 1,000 行をランダムに選択しようとしているとしますmy_table。これはそれを行う1つの方法です:

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 に答える