oralce中的分组排序

目前有3张表
-----学生

CREATE TABLE student(
student_id NUMBER PRIMARY KEY,
student_name VARCHAR2(30) NOT NULL)
insert into student value(student_id,student_name) values (1,'张三');
insert into student value(student_id,student_name) values (2,'李四');
insert into student value(student_id,student_name) values (3,'王五');
insert into student value(student_id,student_name) values (4,'赵六');
insert into student value(student_id,student_name) values (5,'刘七');
insert into student value(student_id,student_name) values (6,'陈八');

------分数

CREATE TABLE score(
score_id NUMBER PRIMARY KEY,
student_id NUMBER,
course_id NUMBER,
score NUMBER)
insert into score value(score_id,student_id,course_id,score) values (1,1,1,92);
insert into score value(score_id,student_id,course_id,score) values (2,1,2,93);
insert into score value(score_id,student_id,course_id,score) values (3,1,3,94);
insert into score value(score_id,student_id,course_id,score) values (4,2,1,93);
insert into score value(score_id,student_id,course_id,score) values (5,2,2,92);
insert into score value(score_id,student_id,course_id,score) values (6,2,3,91);
insert into score value(score_id,student_id,course_id,score) values (7,3,1,92);
insert into score value(score_id,student_id,course_id,score) values (8,3,2,94);
insert into score value(score_id,student_id,course_id,score) values (9,3,3,95);
insert into score value(score_id,student_id,course_id,score) values (10,4,1,96);
insert into score value(score_id,student_id,course_id,score) values (11,4,2,97);
insert into score value(score_id,student_id,course_id,score) values (12,4,3,94);
insert into score value(score_id,student_id,course_id,score) values (13,5,1,98);
insert into score value(score_id,student_id,course_id,score) values (14,5,2,91);
insert into score value(score_id,student_id,course_id,score) values (15,5,3,90);
insert into score value(score_id,student_id,course_id,score) values (16,6,1,97);
insert into score value(score_id,student_id,course_id,score) values (17,6,2,99);
insert into score value(score_id,student_id,course_id,score) values (18,6,3,95);

-------课程表
CREATE TABLE course(
course_id NUMBER PRIMARY KEY,
course_name VARCHAR2(30))
insert into course value(course_id,course_name) values (1,'语文')
insert into course value(course_id,course_name) values (2,'数学')
insert into course value(course_id,course_name) values (3,'英语')

在“英语”这科中,有2个学生的成绩都是95分而且都是这科排名第一的,所以当我要查询,每科目的第一名时
 select * from(select sc.course_id,co.course_name,sc.score,st.student_name,[color=red]dense_rank() [/color]over(partition by co.course_name order by sc.score desc) rn from score sc left join course co on sc.course_id=co.course_id 
left join student st on sc.student_id=st.student_id) t where t.rn=1 order by t.course_id,rn asc;

 select * from(select sc.course_id,co.course_name,sc.score,st.student_name,[b] [color=red]rank()[/color]() [/b]over(partition by co.course_name order by sc.score desc) rn from score sc left join course co on sc.course_id=co.course_id 
left join student st on sc.student_id=st.student_id) t where t.rn=1 order by t.course_id,rn asc;

 select * from(select sc.course_id,co.course_name,sc.score,st.student_name,[b] [color=red]row_number()[/color]() [/b]over(partition by co.course_name order by sc.score desc) rn from score sc left join course co on sc.course_id=co.course_id 
left join student st on sc.student_id=st.student_id) t where t.rn=1 order by t.course_id,rn asc;

从结果中可以得知此时的dense_rank和rank()的结果是正确的,而row_number()只是显示其中的一条,至于为什么会选择那条希望有人帮我解答下。。。
而当我们要查询每科目的前3名时即改变rn<4,此时彼此之间的区别就很明显了
在此我们只比较英语这科的排名
dense_rank()会列出4列,其中有2个成绩95分的会并列第一,成绩94的排名第二
rank()会列出3列,其中有2个成绩95分的会并列第一,成绩94的排名第三
row_number()会列出3列,其中有2个成绩95分的从中选一个拍第一,另一个成绩也是95的则排名第二,成绩94的排名第三
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值