我有一个表“student_marks”,其中包含两列“student_id”和“mark”:
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
由于 Students_id 1 和 3 的两名学生得分最高为 5,因此他们被排在第 1 名。对于得分为 2 的学生,排名为 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;
看看这个 fiddle :http://sqlfiddle.com/#!2/2c7e5/32/0
关于mysql - mysql中如何计算排名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11072172/