2016-11-26 7 views
0

入力テーブルデータ:これは、以下のように、ターゲットテーブルに保存されるべきである選択Oracleで5つの選択された列とは異なるような3列

|Col1 |Col2 |Col3 |Col4 |Col5 
|---- | --- |--- |--- |--- 
|AA | 11  |9009 |1  |1 
|AA | 11  |9009 |2  |2 
|BB | 22  |8888 |1  |1 
|CC | 33  |7777 |1  |1 
|CC | 33  |7777 |2  |2 
|DD | 44  |6666 |1  |1 
|EE | 55  |5555 |1  |1 
|EE | 55  |5555 |2  |2 

、COL1、COL2、COL3は、複合主キーで定義されているため。

Col1 |Col2 |Col3 |Col4 |Col5 
----------------------------------- 
AA  |11  |9009 |1  | 1 
BB  |22  |8888 |1  | 1 
CC  |33  |7777 |2  | 2 
DD  |44  |6666 |1  | 1 
EE  |55  |5555 |2  | 2 

最初の3つの列でdistinctを使用することはできますが、5つの列をすべて選択するにはどうすればよいですか?

1つの別個の列を選択する他の例を見てきました。誰もこの例で助けてもらえますか?

+0

「その他の」2つの列の値のうち、どちらを使用しますか?リレーショナル表の行には順序が定義されておらず、 'ORDER BY'節がなければ、データベースは気になる順序で行を戻すことができます。 –

+0

他の2つの列のいずれか1行が正常です。 – inzero

答えて

1

最初の3つの列の各組み合わせに対して行を並べ替える方法の1つは、これは分析関数の仕事です。具体的にはこの場合はrow_number()です。次に、各「グループ」(または分析関数の用語では「パーティション」)から「最初の行」を選択します。

select col1, col2, col3, col4, col5 
from (select col1, col2, col3, col4, col5, 
       row_number() over (partition by col1, col2, col3 order by null) as rn 
     from input_table 
     ) 
where rn = 1 
; 

order by null手段のような何か「あなたが好きな順は、私はちょうど、各パーティション内の行を注文し、気にしません。」

0

もう1つの方法は、GROUP BYを使用し、補助列に集計関数を使用することです。例:

select col1, col2, col3, max(col4) as column4, min(col5) as column5 
from input_table 
group by col1, col2, col3; 
+0

これは、入力データ内の異なるROWSからmax(col4)とmin(col5)を選択することがあります。 OPは入力から1行(任意の行)を選択したいと思うようです。 – mathguy

関連する問題