1. 问题:如下score表有学生id、班级id、学生成绩三个字段,查询每个班级成绩前三名的学生。
2. 思路:使用row_number() over函数分组排序取topN
select * from (select *,row_number() over(partition by c_id order by s_score desc) as 'rank' from score) t1 where t1.rank<4;
3. 知识点:row_number() over(partition by c1 order by c2 (desc)) 及 row_number()、rank()、dense_rank()的区别
row_number()、rank()、dense_rank()三种函数均可以根据某字段对记录进行排序得到排列序号,排序区别如下:
row_number() 排名时不考虑并列情况
rank()考虑并列情况,但排名不连续(如1,2,3,3,5)
dense_rank()考虑并列情况,但排名连续(如1,2,3,3,4)