比较列值并更新Oracle中的另一列

时间:2017-04-02 07:34:37

标签: sql oracle

我有一个场景,我们每个测试都有前两个条目。每个测试的含义我们有两个条目,现在我想比较测试排名并更新表格中的LoginID列。

示例数据:

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都有两个条目,现在我需要比较相应RANK行的TESTID列,并更新LoginId列1和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()Case (When /then)概念,但查询未返回预期结果。

3 个答案:

答案 0 :(得分: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 :(得分:1)

请尝试......

UPDATE tableName
SET LoginID = ( RANK MOD 2 ) + 1;

注意:这假设较小LoginID将始终与每个RANK的较小TestID对应。

进一步阅读...

https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_mod

答案 2 :(得分: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