2

'student_id'と'mark'の2つの列を持つテーブル'student_marks'があります。

student_id | marks
-------------------
    1      |  5
    2      |  2
    3      |  5
    4      |  1
    5      |  2

マークに対応するランクを計算する必要があります。上記の表で期待される出力は次のとおりです。

student_id | marks  | rank
-------------------------
    1      |  5     | 1
    2      |  2     | 3
    3      |  5     | 1
    4      |  1     | 5
    5      |  2     | 3

student_id 1と3の2人の生徒は最高のマーク5を持っているので、ランク1に配置されます。マーク2の生徒の場合、これらの人よりも多くのマークを持っている2人の生徒がいるため、ランクは3です。

上記のようにランクを計算するクエリをどのように記述しますか?

4

1 に答える 1

3

これは変数に負担がかかりますが、機能するはずです。

SELECT student_id, mark, rank FROM (
    SELECT t.*,
           @rownum := @rownum + 1 AS realRank,
           @oldRank := IF(mark = @previous,@oldRank,@rownum) AS rank,
           @previous := mark
    FROM student_marks t, 
         (SELECT @rownum := 0) r,
         (SELECT @previous := 100) g,
         (SELECT @oldRank := 0) h
    ORDER BY mark DESC
 ) as t
 ORDER BY student_id;

このフィドルを見てください:http ://sqlfiddle.com/#!2 / 2c7e5 / 32/0

于 2012-06-17T19:57:16.207 に答える