0

一意の列の組み合わせの特定のセットの各タイプに対して、特定の割合のレコードを選択する必要がある Oracle テーブルがあります。

例えば、

SELECT distinct column1, column2, Column3 from TableX;

そのテーブルの一意のレコードのすべての組み合わせを提供してくれます。そのような各組み合わせの各行の % が必要です。現在、これを達成するために次のクエリを使用していますが、これは長くて遅いです。

SELECT *  
FROM tableX Sample ( 3 ) 
WHERE Column1 = ‘value1’ and       
      Column2 = ‘value2’ and       
      Column3 = ‘value3 

UNION 

SELECT *  
FROM tableX Sample ( 3 ) 
WHERE Column1 = ‘value1’ and       
Column2 = ‘value2’ and       
Column3 = ‘value4 

UNION  
 …   
 …  
SELECT *  
FROM tableX Sample ( 3 ) 
WHERE Column1 = ‘valueP’ and       
Column2 = ‘valueQ’ and       
Column3 = ‘valueR’  

「値」のサフィックスの組み合わせがそのテーブルで一意である場所 (最初のクエリから取得)

クエリの長​​さと速度を改善するにはどうすればよいですか?

4

1 に答える 1

2

1 つのアプローチを次に示します。

select t.*
from (select t.*,
             row_number() over (partition by column1, column2, column3 order by dbms_random()
                               ) as seqnum,
             count(*) over (partition by column1, column2, column3) as totcnt
      from tablex t
     ) t
where seqnum / totcnt <= 0.10 -- or whatever your threshold is

row_number()各グループの行にランダムな順序で連続番号を割り当てるために使用します。句は、where必要な比率を選択します。

于 2013-02-20T16:52:24.393 に答える