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

Sql 比较列值并更新Oracle中的另一列,sql,oracle,Sql,Oracle,我有一个场景,每个测试都有前两个条目。对于每个测试,我们有两个条目,现在我想比较测试等级并更新表中的LoginID列 样本数据: RANK | TestID | LoginID -----+--------+--------- 234 14 null 235 14 null 330 15 null 331 15 null 223 18 null 222 18

我有一个场景,每个测试都有前两个条目。对于每个测试,我们有两个条目,现在我想比较测试等级并更新表中的
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
有两个条目,现在我需要比较相应
testId
行的
RANK
列,并用1和2更新
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)
概念,但是查询没有返回预期的结果。

您可以使用
合并
和窗口函数
行数

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;

您可以将
MERGE
与窗口功能
row\u 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;
请试试

UPDATE tableName
SET LoginID = ( RANK MOD 2 ) + 1;
注意:这假设较小的
LoginID
对于每个
TestID
,总是与较小的
RANK
相对应

进一步阅读

请尝试

UPDATE tableName
SET LoginID = ( RANK MOD 2 ) + 1;
注意:这假设较小的
LoginID
对于每个
TestID
,总是与较小的
RANK
相对应

进一步阅读

试试这个:

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
试试这个:

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