问题:有一个表 table1,字段为:班级/学生姓名/成绩
表中有多个班级,每个班级有多个学生,每个学生有一个成绩,求出每个班成绩是前5名的列表,要求用一个SQL语句实现,不能用指针/游标/存储过程等.
表样例数据:
班级 学生姓名 成绩
二 帅哥1 66
二 帅哥2 66
二 帅哥3 77
二 帅哥4 88
二 帅哥5 33
二 帅哥6 26
三 美女1 92
三 美女2 77
四 孩子1 35
四 孩子2 66
四 孩子3 53
一 学生1 70
一 学生2 55
一 学生3 90
一 学生4 77
一 学生5 94
一 学生6 78
一 学生7 99要求的结果集:
班级 学生姓名 成绩
二 帅哥4 88
二 帅哥3 77
二 帅哥1 66
二 帅哥2 66
二 帅哥5 33
三 美女1 92
三 美女2 77
四 孩子2 66
四 孩子3 53
四 孩子1 35
一 学生7 99
一 学生5 94
一 学生3 90
一 学生6 78
一 学生4 77
每个班只要前5名,而且要求所有的班级都列出来

解决方案 »

  1.   

    select class,name,score from
    (select class,rank() over(partition by class order by score desc) rk,name,score 
    from table1)
    where rk<=5;
      

  2.   

    智珠子,
      这个解法不错,利用了Oracle特有的功能,但是有个问题,如果某个班级的成绩都相同,那么应该是全部并列第一名,都要显示出来,可用你的方法只能显示前5条.
      

  3.   

    有并列名次用dense_rank():
    select * from (
    select t.*,dense_rank() over(partition by 班级 order by 成绩 desc) rk from table1 t
    )where rk < 6
      

  4.   

    (寻) 
    佩服,没想到Oracle中有这么丰富的查询语句,真是天外有天/人外有人呀
      

  5.   

    select tt.class,tt.name ,tt.score
    from ( select t.class, row_number() over(partition by t.class order by t.score desc) rw,t.name,t.score from table1 t) tt
    where tt.rw<=5;