oracle数据库rank over用法,Oracle 中rank() over()的用法

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

1. rank()函数

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

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

0818b9ca8b590ca3270a3433284dd417.png,孤陋寡闻了。

准备工作:

新建一个表

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

数据显示:

0818b9ca8b590ca3270a3433284dd417.png

2. 作为聚合函数的用法

0818b9ca8b590ca3270a3433284dd417.png

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

示例:

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

select rank(4) within group(order by id) "location" from t_ygy_demo_score;

0818b9ca8b590ca3270a3433284dd417.png

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

3. 作为分析函数的用法

0818b9ca8b590ca3270a3433284dd417.png

功能:

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

示例:

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

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

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

0818b9ca8b590ca3270a3433284dd417.png

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

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

select id,name,course,score ,rank() over(order by name) "名次" from t_ygy_demo_score;

0818b9ca8b590ca3270a3433284dd417.png

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;

0818b9ca8b590ca3270a3433284dd417.png

4. 总结

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

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

5. 附录

可以参考的文章:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值