目前有3张表
-----学生
------分数
-------课程表
在“英语”这科中,有2个学生的成绩都是95分而且都是这科排名第一的,所以当我要查询,每科目的第一名时
从结果中可以得知此时的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的排名第三
-----学生
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的排名第三