加入收藏 | 设为首页 | 会员中心 | 我要投稿 泉州站长网 (https://www.0595zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Oracle排名函数(Rank)实例分析

发布时间:2021-12-07 13:08:35 所属栏目:教程 来源:互联网
导读:--已知:两种排名方式(分区和不分区):使用和不使用partition --两种计算方式(连续,不连续),对应函数:dense_rank,rank 查询原始数据:学号,姓名,科目名,成绩 select * from t_score S_ID S_NAME SUB_NAME SCORE 1 张三 语文 80.00 2 李四 数学 80.00 1 张三

--已知:两种排名方式(分区和不分区):使用和不使用partition
 
--两种计算方式(连续,不连续),对应函数:dense_rank,rank
 
·查询原始数据:学号,姓名,科目名,成绩
 
select * from t_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排名(简单排名)
 
select sc.s_id,sc.s_name,sub_name,sc.score,
 
rank() over (order by score desc) 名次
 
from t_score sc
 
where sub_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():非连续排名与连续排名(都是简单排名)
 
select sc.s_id,sc.s_name,sub_name,sc.score,
 
dense_rank() over (order by score desc) 名次
 
from t_score sc
 
where sub_name='Oracle'
 
S_ID
 
S_NAME
 
SUB_NAME
 
SCORE
 
名次
 
4
 
杨过
 
Oracle
 
77.00
 
1
 
2
 
李四
 
Oracle
 
77.00
 
1
 
3
 
张三丰
 
Oracle
 
0.00
 
2
 
·查询各学生各科排名(分区排名)
 
select sc.s_id,sc.s_name,sub_name,sc.score,
 
rank() over
 
(partition by sub_name order by score desc) 名次
 
from t_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,sc.s_name,sub_name,sc.score, 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
 
·查询各同学总分
 
select s_id,s_name,sum(score) sum_score from t_score
 
group by s_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
 
·根据总分查询各同学名次
 
select x.*,
 
rank() over (order by sum_score desc) 名次
 
from (
 
select s_id,s_name,sum(score) sum_score from t_score
 
group by s_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 (order by 排序字段 顺序)
 
rank() over (partition by 分组字段 order by 排序字段 顺序)
 
1.顺序:asc|desc 名次与业务相关:
 
示例:找求优秀学员:成绩:降序 迟到次数:升序
 
2.分区字段:根据什么字段进行分区。
 
问题:分区与分组有什么区别?
 
·分区只是将原始数据进行名次排列(记录数不变),
 
·分组是对原始数据进行聚合统计(记录数变少,每组返回一条),注意:聚合。

(编辑:泉州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读