Rank Scores --leetcode

Rank Scores
Write a SQL query to rank scores. If there is a tie between two scores, 
both should have the same ranking. Note that after a tie, 
the next ranking number should be the next consecutive integer value. 
In other words, there should be no "holes" between ranks.

+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+
For example, given the above Scores table,
 your query should generate the following report (order by highest score):

+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

solution:
關聯的比較樸素的思想
SELECT Scores.Score, COUNT(Ranking.Score) AS RANK
FROM Scores
     , (
       SELECT DISTINCT Score
         FROM Scores
       ) Ranking
 WHERE Scores.Score <= Ranking.Score
 GROUP BY Scores.Id, Scores.Score
 ORDER BY Scores.Score DESC;

和上面方法是同樣的
select Scores.Score, COUNT(Ranking.Score) AS RANK
from Scores
join (
            SELECT DISTINCT Score
              FROM Scores
            ) Ranking
 WHERE Scores.Score <= Ranking.Score
  GROUP BY Scores.Id, Scores.Score
  ORDER BY Scores.Score DESC;

下面 這個查的方式不一樣  感受和調用for循環同樣
SELECT Score,
(SELECT COUNT(DISTINCT Score) FROM Scores WHERE Score >= s.Score) Rank
FROM Scores s ORDER BY Score DESC;


SELECT Score,
(SELECT COUNT(*) FROM (SELECT DISTINCT Score s FROM Scores) t WHERE s >= Score) Rank
FROM Scores ORDER BY Score DESC;

下面的寫法就變態一點了  用了兩個變量
SELECT Score,
@rank := @rank + (@pre <> (@pre := Score)) Rank
FROM Scores, (SELECT @rank := 0, @pre := -1) INIT
ORDER BY Score DESC;
相關文章
相關標籤/搜索