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