2017-04-02 12 views
1

私は、各テストの最初の2つのエントリがあるシナリオを持っています。各テストの意味は2つのエントリがあり、テストランクを比較してテーブルのLoginID列を更新したいと考えています。列の値を比較し、Oracleの別の列を更新します

サンプルデータ:上記の表に

RANK | TestID | LoginID 
-----+--------+--------- 
234  14  null 
235  14  null 
330  15  null 
331  15  null 
223  18  null 
222  18  null 
500  20  null 
501  20  null 

、私は今、私は1と2とLoginId列を対応TESTIDRANK列を比較し、更新する必要があり、各testIdための2つのエントリを有しています。次のように

最後に、私は出力を探しています:

RANK | TestID | LoginID 
-----+--------+--------- 
234  14  1 
235  14  2 
330  15  1 
331  15  2 
223  18  2 
222  18  1 
500  20  1 
501  20  2 

ことができます誰もがこれを達成するためのよりよい方法を示唆している?私はmin()max()というコンセプトで試してみましたが、クエリは期待した結果を返していません。

答えて

2

あなたは窓関数row_numberMERGEを使用することができます。

merge into your_table t 
using (
    select t.*, 
     row_number() over (partition by testId order by rank) as rn 
    from your_table t 
) s on (
    t.rank = s.rank 
    and t.testId = s.testId 
    ) 
when matched then update set t.loginId = s.rn; 
1

これを試してみてください:

UPDATE 
yourTable T, 
(
    SELECT 
     TestID 
     ,MIN(RANK) AS firstRank 
     ,MAX(RANK) AS secondRank 
    FROM 
     yourTable 
    GROUP BY 
     TestID 
) A 
SET RANK = 
    CASE WHEN RANK = A.firstRank THEN 1 
     WHEN RANK = A.secondRank THEN 2 
     END 
関連する問題