2014-07-25 3 views
1

나는 Oracle에 익숙하며 RANK() (ORDER BY score DESC) AS 순위를 사용하여 다음과 같은 순위를 얻습니다.MySQL - Oracle RANK() OVER (ORDER BY score DESC)

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 
여기에보고 후, 나는이를 발견했습니다 -
Score | Rank 
-------------- 
    100 | 1 
    100 | 1 
    99 | 3 
    98 | 4 
    98 | 4 
    98 | 4 
    97 | 7 

나는 안개가 자욱한 MySQL의에서이 작업을 수행하는 방법 없어

그건 내가 원한 것이 아니야. 당신이 Barmar의 쿼리의 속도에 가까운 얻으려면 코스 GROUP_CONCAT의

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; 

특정 제한 사항이 있습니다 ...

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
SELECT score 
    , FIND_IN_SET(score,(SELECT GROUP_CONCAT(score ORDER BY score DESC) FROM my_scores)) 
    FROM my_scores; 

또는 :

+0

이 답변에 감사드립니다. 딸기 - Barmar의 쿼리는 내 생각에 'my_scores'가 인라인보기이므로 가장 적합합니다. – doublesidedstickytape

관련 문제