SELECT
*
FROM
(SELECT `no`,subject_name,score,RANK() over(partition by `no` ORDER BY score desc) `rank_num` FROM student_info)t
WHERE t.rank_num <=3
ORDER BY `no`,rank_num
执行结果
no
subject_name
score
rank_num
1
math
91
1
1
chinese
90
2
1
chemistry
88
3
2
physics
91
1
2
chemistry
91
1
2
math
85
3
3
math
76
1
3
chinese
45
2
3
chemistry
40
3
DENSE_RANK()
执行SQL
SELECT
*
FROM (SELECT `no`,subject_name,score,DENSE_RANK() over(partition by `no` ORDER BY score desc) `rank_num` FROM student_info)t
WHERE t.rank_num <=3
ORDER BY `no`,rank_num
执行结果
no
subject_name
score
rank_num
1
math
91
1
1
chinese
90
2
1
chemistry
88
3
2
physics
91
1
2
chemistry
91
1
2
math
85
2
2
chinese
84
3
3
math
76
1
3
chinese
45
2
3
chemistry
40
3
ROW_NUMBER()
执行SQL
SELECT
*
* FROM (SELECT `no`,subject_name,score,ROW_NUMBER() over(partition by `no` ORDER BY score desc) `rank_num` FROM student_info)t
* WHERE t.rank_num <=3
* ORDER BY `no`,rank_num
SELECT
e1.`no`,e1.subject_name,e1.score,
(SELECT count(e2.score) FROM student_info AS e2 WHERE e1.score < e2.score AND e1.no = e2.no)+1 rank_num
FROM
student_info AS e1
WHERE
(SELECT count(e2.score) FROM student_info AS e2 WHERE e1.score < e2.score AND e1.no = e2.no) < 3
ORDER BY `no`,score DESC
执行结果
no
subject_name
score
rank_num
1
math
91
1
1
chinese
90
2
1
chemistry
88
3
2
physics
91
1
2
chemistry
91
1
2
math
85
3
3
math
76
1
3
chinese
45
2
3
chemistry
40
3
注意
可以看到有并列名次,在特殊情况下还是会取到过多的数据,比如获取前一条
使用变量
执行SQL
SELECT
`no`,subject_name,score,rank_num
FROM
( SELECT s.subject_name,s.score,@rankn:= IF(@sn = `no`,@rankn+1,1) rank_num,(@sn := `no`) `no`
FROM
student_info s,(SELECT @rankn:=1,@sn := '')t
ORDER BY s.`no`,s.score DESC )t2
WHERE t2.rank_num <= 3
ORDER BY t2.`no`,t2.rank_num