我有一个场景,我们每个测试都有前两个条目。每个测试的含义我们有两个条目,现在我想比较测试排名并更新表格中的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)
概念,但查询未返回预期结果。
答案 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