问题:有一个表 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名,而且要求所有的班级都列出来
表中有多个班级,每个班级有多个学生,每个学生有一个成绩,求出每个班成绩是前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名,而且要求所有的班级都列出来
(select class,rank() over(partition by class order by score desc) rk,name,score
from table1)
where rk<=5;
这个解法不错,利用了Oracle特有的功能,但是有个问题,如果某个班级的成绩都相同,那么应该是全部并列第一名,都要显示出来,可用你的方法只能显示前5条.
select * from (
select t.*,dense_rank() over(partition by 班级 order by 成绩 desc) rk from table1 t
)where rk < 6
佩服,没想到Oracle中有这么丰富的查询语句,真是天外有天/人外有人呀
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;