この質問は、SQL Server でランダムな (っぽい) レコードのサンプルを取得することについて尋ねたもので、答えは を使用することでしたTABLESAMPLE
。Oracle 10に同等のものはありますか?
そうでない場合、クエリ セットから結果のランダム サンプルを取得する標準的な方法はありますか? たとえば、通常は数百万を返すクエリから 1,000 のランダムな行を取得するにはどうすればよいでしょうか?
この質問は、SQL Server でランダムな (っぽい) レコードのサンプルを取得することについて尋ねたもので、答えは を使用することでした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)
これはすでに回答されていることは知っていますが、ここに非常に多くの訪問があるのを見て、SAMPLE 句を使用するが最初に行をフィルタリングできるバージョンを 1 つ追加したいと思います。
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 );
というテーブルからちょうど 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 が投稿した回答とは少し異なります。どちらも同じコストと実行時間です。唯一の違いは、サンプルの取得に使用する乱数を選択できることです。