分组取前几位是数据库查询的常见问题,例如取各班成绩的第一名。这个就需要用到ROW_NUMBER函数,这个函数Oracle,SQLServer,MySQL(需8.0以上版本)都是支持的,核心用法也一样:PARTITION BY分组 + ORDER BY排序 + 外层筛选使用rn筛选。
假设表student_score有如下字段
studentid 学生id
score 总分
student_info 学生表
studentid 学生id
classid 班级
studentname 学生姓名
查询语句如下:
select * from (
select a.*
ROW_NUMBER()
OVER (PARTITION BY a.classid ORDER BY a.score DESC) AS rn --核心点1
from (select studentid,studentname,classid,score from student_score left join student_info on student_score.studentid=student_info.studentid)a
)
where rn=1 --核心点2
低版本只能使用max函数了,要复杂的多。