天天看点

Oracle 中rank() over()的用法

之前整理了rank() over()的用法,但是,今天遇到了问题,居然还是不会,这里再重新学习一下。

1. rank()函数

        rank是等级的意思,rank()函数是一个聚合函数,也是一个分析函数。

之前只知道,rank()函数可以和over()一起使用,用来排序什么的,原来还有这些知识

Oracle 中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, '乔巴');
           

数据显示:

Oracle 中rank() over()的用法

2. 作为聚合函数的用法

Oracle 中rank() over()的用法

实现功能:根据order by 后面的字段排序后,在rank()中指定的数据的记录顺序号(就是排在第几名)

示例:

根据id排序后,id是4的记录的位置

select rank(4) within group(order by id) "location" from t_ygy_demo_score;
           
Oracle 中rank() over()的用法

注意:这里的rank()的参数和order by 后的参数数量需要一致。

3. 作为分析函数的用法

Oracle 中rank() over()的用法

功能:

分析每个记录的排序或等级,rank()值相同时排名相同,其后排名跳跃不连续 

示例:

1)查询出每门课程的学生排名,并且显示出名次

不显示名次的话,我们在where后,使用order by 就可以实现,但是显示名次的话,就不行了,

select id,course,name,score ,rank() over(partition by course order by score desc)"名次" from t_ygy_demo_score;
           
Oracle 中rank() over()的用法

他这里的排名,分数相同的排名是相同的名次是相同的。

2)按照name排序,并显示排名(虽然没什么意义)

select id,name,course,score ,rank() over(order by name) "名次" from t_ygy_demo_score;
           
Oracle 中rank() over()的用法

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;
           
Oracle 中rank() over()的用法

4. 总结

1、partition  by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组。

2、Rank 是在每个分组内部进行排名的。

5. 附录

可以参考的文章:

                           http://www.cnblogs.com/mycoding/archive/2010/05/29/1747065.html