表格中的数据
ID attempt1 attempt2 attempt3
1 2.00 2.10 1.99
2 2.15 2.01 1.80
3 1.85 2.05 1.98
预期结果
ID attempt1 attempt2 attempt3 rank
2 2.15 2.01 1.80 1
1 2.00 2.10 1.99 2
3 1.85 2.05 1.98 3
查询以实现结果
select ID, attempt1, attempt2, attempt3, ROW_NUMBER() OVER(ORDER BY attempt1, attempt2, attempt3)
AS rank FROM Attempts
当我尝试在一列中对值进行排名时,上面的查询工作正常,例如attempt1,但是当我添加其他字段时,排名不正确。我不确定你是怎么造成这种情况的。我尝试了以下解决方案Multiple columns in OVER ORDER BY,但它似乎不起作用。
答案 0 :(得分:1)
您需要计算各个字段的最大值。
在SQL Server 2008中,我想我会这样做:
select t.*,
row_number() over (order by v.max_attempt desc) as seqnum
from attempts t cross apply
(select max(attempt)
from (values (t.attempt1), (t.attempt2), (t.attempt3)) v(attempt)
) v (max_attempt);
答案 1 :(得分:1)
您需要在ROW_NUMBER()
函数之外导出“该行的最大分数”。
到目前为止,您所写的内容按attempt1
排序,然后在有差距的地方排序,按attempt2
排序,以及仍有联系的地方,按attempt3
排序。< / p>
以下查询使用APPLY
中的子查询,以便在单行中的三列中使用MAX()
。然后可以在ROW_NUMBER()
。
SELECT
attempts.ID,
attempts.attempt1,
attempts.attempt2,
attempts.attempt3,
ROW_NUMBER() OVER (ORDER BY max_score.val DESC) AS rank
FROM
attempts
CROSS APPLY
(
SELECT MAX(score) AS val
FROM (VALUES (attempts.attempt1),
(attempts.attempt2),
(attempts.attempt2)) attempt(score)
)
max_score