分组选择数据

问题:如何获得每个分组前n项结果?

场景:假设有一个表,记录了学生所有科目的成绩,那么现在要取出每个科目分数最高的3位同学的考试成绩。
表名为student_grade
表中字段为:
course_id,course_name, student_id, student_name, grade

方法一:利用row_number()函数

select course_id,course_name, student_id, student_name, grade,    row_number() over(partition by course_id order by grade desc) as rankfrom student_gradewhere rank <= 3

方法二:利用嵌套函数

select course_id,course_name, student_id, student_name, grade,    (select count(*)from student_grade as t2        where t1.grade<=t2.grade) as rankfrom student_grade as t1where rank <=3