MySQLスコアランキングの問題

4849 ワード

今日はLeetCodeのMySQLの問題で1つの問題に遭遇しました.スコアランキングを実現するためにSQLクエリーを作成します.2つのスコアが同じ場合、2つのスコアランキング(Rank)は同じです.平分後の次の順位は次の連続する整数値であることに注意してください.言い換えれば、順位の間に「間隔」があるべきではない.
+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+


たとえば、上記のScoresテーブルに基づいて、クエリーを返します(スコアが高いものから低いものまで):
+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+



私が最初に思いついたのは開窓関数ですが、MySQLでは開窓関数がサポートされていないことを知っています.だから、私の解題の構想は以下の通りです.まず、点数ランキングの目的を理解しなければなりません.条件は、2つの点数ランキング(Rank)が同じです.つまり、クラスに50人の学生がいたら、すべての点数が同じであれば、1つのランキング(1位)しかありません.点数が90点と80点しかなければ、2位(1位と2位)しかありません.【ランキングは人数とは関係ありません】では、採点を重ねて集計すると、いくつかのランキングがあることがわかります.では、現在の点数はクラスで何位にランクされているのか、私より大きい点数を統計(重み付け)すれば私の順位です.スコアを降順にソート:select a.Score as score from Scores a order by Score DESC;私より大きい風の数を統計するには私の順位です:select count(distinct b.Score)from Scores b where b.Score>=私の点数結合:
select a.Score as score ,
(select count(distinct b.Score) from Scores b 
where b.Score >=a.Score) as rank from Scores a 
order by Score DESC;