如何根据字段中的最大值对记录进行排名?

时间:2018-02-15 14:57:51

标签: sql sql-server-2008

表格中的数据

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,但它似乎不起作用。

2 个答案:

答案 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