MySQL - 如何进行Oracle RANK()OVER(ORDER BY得分DESC)

时间:2014-07-25 10:05:47

标签: mysql

我熟悉Oracle并且通常会做一个RANK()(ORDER BY得分DESC)AS级别来获得这样的排名:

 Score | Rank
--------------
   100 |    1
   100 |    1
    99 |    3
    98 |    4
    98 |    4
    98 |    4
    97 |    7

我没有在MySQL中如何做到这一点最模糊 - 看完这里后,我发现了这个:

SET @prev_value = NULL;
SET @rank_count = 0;
SELECT score
     , CASE
       WHEN @prev_value = score 
          THEN @rank_count
       WHEN @prev_value := score 
          THEN @rank_count := @rank_count + 1
       END AS rank
  FROM ...

但这会将其返回为:

 Score | Rank
--------------
   100 |    1
   100 |    1
    99 |    2
    98 |    3
    98 |    4
    98 |    4
    97 |    5

这不是我想要的。

2 个答案:

答案 0 :(得分:2)

添加另一个变量:

SET @prev_value = NULL;
SET @rank_count = 0;
SET @rank_increasing = 0;
SELECT score
     , @rank_increasing := @rank__increasing + 1 AS row_num
     , CASE
       WHEN @prev_value = score 
          THEN @rank_count
       WHEN @prev_value := score 
          THEN @rank_count := @rank_increasing
       END AS rank
  FROM ...

答案 1 :(得分:1)

SELECT score
     , FIND_IN_SET(score,(SELECT GROUP_CONCAT(score ORDER BY score DESC) FROM my_scores))
  FROM my_scores;

或者,如果你想接近巴马尔查询的速度......

SELECT score
     , FIND_IN_SET(score, @vals) rank
  FROM my_scores
  JOIN (SELECT @vals := GROUP_CONCAT(score ORDER BY score DESC) FROM my_scores) x;

当然GROUP_CONCAT有一定的局限性!