【Oracle】 排名函数

转自:https://blog.csdn.net/qinshijangshan/article/details/52943406

create table course_score(
       course_name varchar2(4),-- 科目
       user_name varchar2(4),-- 姓名
       score number-- 成绩
);

插入的数据如下:

科目 姓名 成绩

数学 陈大 60
语文 陈大 48
英语 陈大 60
数学 王二 60
语文 王二 74
英语 王二 70
数学 张三 50
语文 张三 50
英语 张三 70
数学 李四 30
语文 李四 80
英语 李四 63

共12行数据;

select a.*,rownum from course_score a;

select a.*,rownum from course_score a order by score desc;

在order by之前rownum已经确定,order by无法改变排名(排名顺序都不能保证,就更没必要讨论相同值排名不同了); 

row_number()函数

select a.*,row_number()over(order by score desc) 排名 from course_score a;

加partition()分区,分科目排名

相同值的排名会递增(相同成绩需要相同)

 rank()函数

select a.*,rank()over(order by score desc) 排名 from course_score a;

加partition()

select a.*,rank()over(partition by course_name order by score desc) 排名 from course_score a;

rank()可以达到相同值排名相同,但排名相同的相当于会占位,后面的排名会跳号

dense_rank()

select a.*,dense_rank()over(order by score desc) 排名 from course_score a;

加partition()

select a.*,dense_rank()over(partition by course_name order by score desc) 排名 from course_score a;

dense_rank()可实现并列排名;

 

具体用row_number()、rank()、dense_rank()根据自己的实际情况进行选择;

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值