之前整理了rank() over()的用法,但是,今天遇到了问题,居然还是不会,这里再重新学习一下。
1. rank()函数
rank是等级的意思,rank()函数是一个聚合函数,也是一个分析函数。
之前只知道,rank()函数可以和over()一起使用,用来排序什么的,原来还有这些知识

,孤陋寡闻了。
准备工作:
新建一个表
-- Create table
create table T_YGY_DEMO_SCORE
(
ID NUMBER(11),
COURSE VARCHAR2(10),
SCORE NUMBER(5,2),
NAME VARCHAR2(20)
)
-- Add comments to the table
comment on table T_YGY_DEMO_SCORE
is '学生成绩表';
-- Add comments to the columns
comment on column T_YGY_DEMO_SCORE.ID
is 'ID';
comment on column T_YGY_DEMO_SCORE.COURSE
is '课程名';
comment on column T_YGY_DEMO_SCORE.SCORE
is '分数';
comment on column T_YGY_DEMO_SCORE.NAME
is '学生姓名';
数据:
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (1, '数学', 100, '路飞');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (2, '数学', 90, '索隆');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (3, '数学', 80, '乔巴');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (4, '语文', 90, '路飞');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (5, '语文', 90, '索隆');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (6, '语文', 80, '乔巴');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (7, '英语', 90, '路飞');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (8, '英语', 80, '索隆');
insert into T_YGY_DEMO_SCORE (ID, COURSE, SCORE, NAME)
values (9, '英语', 80, '乔巴');
数据显示:
2. 作为聚合函数的用法
实现功能:根据order by 后面的字段排序后,在rank()中指定的数据的记录顺序号(就是排在第几名)
示例:
根据id排序后,id是4的记录的位置
select rank(4) within group(order by id) "location" from t_ygy_demo_score;
注意:这里的rank()的参数和order by 后的参数数量需要一致。
3. 作为分析函数的用法
功能:
分析每个记录的排序或等级,rank()值相同时排名相同,其后排名跳跃不连续
示例:
1)查询出每门课程的学生排名,并且显示出名次
不显示名次的话,我们在where后,使用order by 就可以实现,但是显示名次的话,就不行了,
select id,course,name,score ,rank() over(partition by course order by score desc)"名次" from t_ygy_demo_score;
他这里的排名,分数相同的排名是相同的名次是相同的。
2)按照name排序,并显示排名(虽然没什么意义)
select id,name,course,score ,rank() over(order by name) "名次" from t_ygy_demo_score;
3) 查询出每门课程的最高分的信息
select * from (select id ,name,course,score,rank() over(partition by course order by score desc) rank from t_ygy_demo_score) rs where rs.rank=1;
4. 总结
1、partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组。
2、Rank 是在每个分组内部进行排名的。
5. 附录
可以参考的文章:
http://www.cnblogs.com/mycoding/archive/2010/05/29/1747065.html