大佬教程收集整理的这篇文章主要介绍了Oracle排名函数(Rank)实例详解,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
--已知:两种排名方式(分区和不分区):使用和不使用partition
--两种计算方式(连续,不连续),对应函数:dense_rank,rank
·查询原始数据:学号,姓名,科目名,成绩
select*fromt_score
S_ID |
S_name |
SUB_name |
score |
1 |
张三 |
语文 |
80.00 |
2 |
李四 |
数学 |
80.00 |
1 |
张三 |
数学 |
0.00 |
2 |
李四 |
语文 |
50.00 |
3 |
张三丰 |
语文 |
10.00 |
3 |
张三丰 |
数学 |
|
3 |
张三丰 |
体育 |
120.00 |
4 |
杨过 |
Java |
90.00 |
5 |
mike |
c++ |
80.00 |
3 |
张三丰 |
Oracle |
0.00 |
4 |
杨过 |
Oracle |
77.00 |
2 |
李四 |
Oracle |
77.00 |
·查询各学生科目为Oracle排名(简单排名)
selectsc.s_ID,sc.s_name,sub_name,sc.score,
rank() over(orderbyscoredesc)名次
fromt_score sc
wheresub_name='Oracle'
S_ID |
S_name |
SUB_name |
score |
名次 |
4 |
杨过 |
Oracle |
77.00 |
1 |
2 |
李四 |
Oracle |
77.00 |
1 |
3 |
张三丰 |
Oracle |
0.00 |
3 |
对比:rank()与dense_rank():非连续排名与连续排名(都是简单排名)
selectsc.s_ID,
dense_rank() over(orderbyscoredesc)名次
fromt_score sc
wheresub_name='Oracle'
S_ID |
S_name |
SUB_name |
score |
名次 |
4 |
杨过 |
Oracle |
77.00 |
1 |
2 |
李四 |
Oracle |
77.00 |
1 |
3 |
张三丰 |
Oracle |
0.00 |
2 |
·查询各学生各科排名(分区排名)
selectsc.s_ID,
rank() over
(partitionbysub_nameorderbyscoredesc)名次
fromt_score sc
S_ID |
S_name |
SUB_name |
score |
名次 |
4 |
杨过 |
JAVA |
90.00 |
1 |
4 |
杨过 |
Oracle |
77.00 |
1 |
2 |
李四 |
Oracle |
77.00 |
1 |
3 |
张三丰 |
Oracle |
0.00 |
3 |
5 |
mike |
c++ |
80.00 |
1 |
3 |
张三丰 |
数学 |
|
1 |
2 |
李四 |
数学 |
80.00 |
2 |
1 |
张三 |
数学 |
0.00 |
3 |
3 |
张三丰 |
体育 |
120.00 |
1 |
1 |
张三 |
语文 |
80.00 |
1 |
2 |
李四 |
语文 |
50.00 |
2 |
3 |
张三丰 |
语文 |
10.00 |
3 |
·查询各科前2名(分区排名)
·类似:新闻表,求栏目点击率在前3位的新闻。
商品表,求各类别销售额在前10位的商品。
select * from (
select sc.s_ID,
dense_rank() over
(partition by sub_name order by score desc)名次
from t_score sc
) x
where x.名次<=2
S_ID |
S_name |
SUB_name |
score |
名次 |
4 |
杨过 |
JAVA |
90.00 |
1 |
4 |
杨过 |
Oracle |
77.00 |
1 |
2 |
李四 |
Oracle |
77.00 |
1 |
3 |
张三丰 |
Oracle |
0.00 |
2 |
5 |
mike |
c++ |
80.00 |
1 |
3 |
张三丰 |
数学 |
|
1 |
2 |
李四 |
数学 |
80.00 |
2 |
3 |
张三丰 |
体育 |
120.00 |
1 |
1 |
张三 |
语文 |
80.00 |
1 |
2 |
李四 |
语文 |
50.00 |
2 |
·查询各同学总分
selects_ID,s_name,sum(score) sum_scorefromt_score
groupbys_ID,s_name
S_ID |
S_name |
SUM_score |
1 |
张三 |
80.00 |
2 |
李四 |
207.00 |
3 |
张三丰 |
130.00 |
4 |
杨过 |
167.00 |
5 |
mike |
80.00 |
·根据总分查询各同学名次
selectx.*,
rank() over (orderbysum_scoredesc)名次
from(
selects_ID,s_name ) x
S_ID |
S_name |
SUM_score |
名次 |
2 |
李四 |
207.00 |
1 |
4 |
杨过 |
167.00 |
2 |
3 |
张三丰 |
130.00 |
3 |
1 |
张三 |
80.00 |
4 |
5 |
mike |
80.00 |
4 |
语法:
rank() over (orderby排序字段 顺序)
rank() over (partitionby分组字段orderby排序字段 顺序)
1.顺序:asc|desc名次与业务相关:
示例:找求优秀学员:成绩:降序迟到次数:升序
2.分区字段:根据什么字段进行分区。
问题:分区与分组有什么区别?
·分区只是将原始数据进行名次排列(记录数不变),
·分组是对原始数据进行聚合统计(记录数变少,每组返回一条),注意:聚合。
脚本: |
create table t_score ( autoIDnumberprimary key, s_IDnumber(3), s_namechar(8) not null, sub_name varchar2(20), scorenumber(10,2) ); insert into t_score (autoID,s_ID,score) values (8,1,'张三','语文',80); insert into t_score (autoID,score) values (9,2,'李四','数学',score) values (10,0); insert into t_score (autoID,score) values (11,50); insert into t_score (autoID,score) values (12,3,'张三丰',10); insert into t_score (autoID,score) values (13,null); insert into t_score (autoID,score) values (14,'体育',120); insert into t_score (autoID,score) values (15,4,'杨过','java',90); insert into t_score (autoID,score) values (16,5,'mike','c++',score) values (3,'oracle',score) values (4,77); insert into t_score (autoID,score) values (17,77); commit; |
以上是大佬教程为你收集整理的Oracle排名函数(Rank)实例详解全部内容,希望文章能够帮你解决Oracle排名函数(Rank)实例详解所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。