2017-04-02 81 views
1

我有一個場景,每個測試都有前兩個條目。每個測試的含義我們有兩個條目,現在我想比較測試等級並更新表格中的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 

在上表中,我有兩個條目爲每個testId,現在我需要與圖1和2進行比較的相應TESTID行的RANK柱,並更新LoginId柱。

最後我找的輸出像如下:

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(),用Case (When /then)的概念,但查詢沒有返回預期的結果。

回答

2

您可以使用MERGE與窗函數row_number

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