2016-05-08 6 views
-1

私は、次の条件を使用してSQLを使用してテーブルを作成しました:sqlで次の条件を実行する方法は?

create table tbl2 as 
select a.*, rank() over (partition by col1 order by col2) as rnk 
from tbl1 

は、今私は、以下の条件でレコードを選択したいTBL2から別のテーブルを作成したい:レコードが利用できる唯一のランクを持っている場合、私はそのレコードを選択しますが、レコードに複数のランクがある場合は、2番目のランクのレコードを選択します。私は例をあげてみましょう:

col1 rnk 
1  1 
2  1 
2  2 
3  1 
3  2 
3  3 

所望の出力:

col1 rnk 
1  1 
2  2 
3  2 

どのように私は、SQLを使用して、私の出力を得るのですか?

+3

は何RDBMS、使用している、第二ランクは2ではない場合のために動作しませんか。 –

+0

私はoracle 11gを使用しています – user3740154

+0

私の答えはSQL Serverで動作するはずですが、私はoracleがそれをどのように処理するかはわかりません。それを試してみてください。また、今後の質問では、関連するrdbmsにタグを付けてください。 –

答えて

0

このような何かが、トリックを行う必要があります:row_number機能の順に

caseを使用して
SELECT col1, rnk 
FROM 
(
    SELECT col1, rnk, ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY CASE WHEN rnk = 2 THEN 0 ELSE 1 END) rn 
    FROM tbl2 
) x 
WHERE rn = 1 

rnk = 2すべての最初と他の人を取得します。
次に、row_numberが1のレコードだけを選択します。したがって、col1グループのレコードか、rnk = 2のレコードです。

1

単純なアプローチは次のようになります?

select * 
from tbl2 t 
where rnk = 2 or not exists (select 1 from tbl2 where col1 = t.col1 and rnk <> t.rnk) 

これは、しかし...

+0

私はこのアプローチが私自身の答えより好きです。 +1。 –

関連する問題