Oracle中rank() over()函数排名
--已知:两种排名方式(分区和不分区):使用和不使用partition
--两种计算方式(连续,不连续),对应函数:dense_rank,rank
查询原始数据:学号、姓名、科目名、成绩
select * from t_score
1、rank() over(order by 列名 排序)的结果是不连续的.
如果有4个人,其中有3个是并列第1名,那么最后的排序结果结果如:1 1 1 4
select scoreid, studentid,COURSENAME,totalexamscore ,
rank() over(order by TOTALEXAMSCORE desc)orderbyNum
from SCORECOURSE a ,COURSESCORE b
where a.SCORECOURSEID = b.SCORECOURSEID
举例、查询各学生科目为Oracle排名(简单排名)
select sc.s_id,sc.s_name,sub_name,sc.score,rank() over (order by score desc) 名次from t_score scwhere sub_name='Oracle'
2、dense_rank()over(order by 列名 排序)的结果是连续的.
如果有4个人,其中有3个是并列第1名, 那么最后的排序结果如:1 1 1 2
select scoreid, studentid,COURSENAME,totalexamscore ,
dense_rank()over(order by TOTALEXAMSCORE desc)orderbyNum
from SCORECOURSE a ,COURSESCORE b
where a.SCORECOURSEID = b.SCORECOURSEID
对比:rank()与dense_rank():非连续排名与连续排名(都是简单排名)
举例、dense_rank()
select sc.s_id,sc.s_name,sub_name,sc.score,dense_rank() over (order by score desc) 名次from t_score scwhere sub_name='Oracle'
3、rank () OVER (PARTITION BY 列名 ORDER BY 列名 排序)
使用分区方式获取每门课程的最高分。
SELECT * FROM (SELECT SCOREID,STUDENTID,COURSENAME,TOTALEXAMSCORE,RANK() OVER(PARTITION BY COURSENAME ORDER BY TOTALEXAMSCORE DESC) ORDERBYNUM FROM SCORECOURSE A,COURSESCORE B WHERE A.SCORECOURSEID = B.SCORECOURSEID AND STUDENTID = 'xxxxx') WHERE ORDERBYNUM < 2
举例 1、查询各学生各科排名(分区排名)
•分区只是将原始数据进行名次排列(记录数不变),
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
举例2、查询各科前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) xwhere x.名次<=2
4、根据总分查询各同学名次
查询各同学总分
select s_id,s_name,sum(score) sum_score from t_scoregroup by s_id,s_name
·根据总分查询各同学名次
select x.*,rank() over (order by sum_score desc) 名次from (select s_id,s_name,sum(score) sum_score from t_scoregroup by s_id,s_name ) x
-----使用over实现成绩求和
-----SUM (totalexamscore) OVER (ORDER BY studentid) sum1 实现的是连续求和,如第一个学生的总评成绩是30,则sum1就展示为30,到第二个学生成绩出现的时候,则会依次累加
-----SUM (totalexamscore) OVER () sum2 就相当于是单纯的求和,和直接使用sum是一致的
SELECT scoreid, studentid, totalexamscore,SUM (totalexamscore) OVER (ORDER BY studentid) sum1,SUM (totalexamscore) OVER () sum2FROM coursescore
注:这个案例想了很久也没想到很直观的描述,还请大家亲自去测试一下吧!!
语法:
rank() over (order by 排序字段 顺序)
rank() over (partition by 分组字段 order by 排序字段 顺序)
1.顺序:asc|desc 名次与业务相关:
示例:求优秀学员,成绩:降序 迟到次数:升序
2.分区字段:根据什么字段进行分区。
问题:分区与分组有什么区别?
•分区只是将原始数据进行名次排列(记录数不变),
•分组是对原始数据进行聚合统计(记录数变少,每组返回一条)。
注意:使用rank()over(order by 排序字段 顺序)排序的时候,空值是最大的
(如果排序字段为null,可能造成在排序时将null字段排在最前面,影响排序的正确性。
所以建议将dense_rank()over(order by 列名 排序)改为dense_rank()over(order by 列名 排序 nulls last)
这样只要排序字段为null,就会放在最后,而不会影响排序结果).
sql脚本:
create table t_score(autoid number primary key,s_id number(3),s_name char(8) not null,sub_name varchar2(20),score number(10,2));insert into t_score (autoid, s_id, s_name, sub_name, score)values (8, 1, '张三 ', '语文', 80);insert into t_score (autoid, s_id, s_name, sub_name, score)values (9, 2, '李四 ', '数学', 80);insert into t_score (autoid, s_id, s_name, sub_name, score)values (10, 1, '张三 ', '数学', 0);insert into t_score (autoid, s_id, s_name, sub_name, score)values (11, 2, '李四 ', '语文', 50);insert into t_score (autoid, s_id, s_name, sub_name, score)values (12, 3, '张三丰 ', '语文', 10);insert into t_score (autoid, s_id, s_name, sub_name, score)values (13, 3, '张三丰 ', '数学', null);insert into t_score (autoid, s_id, s_name, sub_name, score)values (14, 3, '张三丰 ', '体育', 120);insert into t_score (autoid, s_id, s_name, sub_name, score)values (15, 4, '杨过 ', 'java', 90);insert into t_score (autoid, s_id, s_name, sub_name, score)values (16, 5, 'mike ', 'c++', 80);insert into t_score (autoid, s_id, s_name, sub_name, score)values (3, 3, '张三丰 ', 'oracle', 0);insert into t_score (autoid, s_id, s_name, sub_name, score)values (4, 4, '杨过 ', 'oracle', 77);insert into t_score (autoid, s_id, s_name, sub_name, score)values (17, 2, '李四 ', 'oracle', 77);commit;
Oracle中rank() over()函数排名相关推荐
- Oracle中rank() over, dense_rank(), row_number() 的区别
Oracle中rank() over, dense_rank(), row_number() 的区别 假设现在有一张学生表student,学生表中有姓名.分数.课程编号,现在我需要按照课程对学生的成绩 ...
- Oracle中ROW_NUMBER() OVER()函数用法
Oracle中ROW_NUMBER() OVER()函数用法 1. 说明:ROW_NUMBER() OVER() 函数的作用:分组排序 2. 原理: row_number() over() 函数,ov ...
- oracle数据库rank over用法,Oracle中rank() over, dense_rank(), row_number() 的区别
Oracle中rank() over, dense_rank(), row_number() 的区别 假设现在有一张学生表student,学生表中有姓名.分数.课程编号,现在我需要按照课程对学生的成绩 ...
- oracle分类函数总结,oracle中分组排序函数用法
项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...
- oracle怎么声明nvl函数,[转载]Oracle中的NVL函数
Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...
- oracle 条件排序函数,oracle中分组排序函数
项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...
- oracle求和分组排序,oracle中分组排序函数用法 - 转
项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...
- oracle中存储过程和函数有什么区别,Oracle中存储过程和函数的区别
Oracle中存储过程和函数的区别 存储过程和函数: www.2cto.com 例子: [sql] //创建过程 create or replace procedure add_emailinfo( ...
- oracle substr(table),oracle中的substr()函数
SUBSTR(cExpression,nStartPosition [,nCharactersReturned]) 其中,cExpression指定要从其中返回字符串的字符表达式或备注字段: nSta ...
最新文章
- Nginx HTTPS功能部署实践
- BIEE多层表头报表的制作方法
- 【深度学习】修改每张人像---ImageNet 的衰落
- ReactiveLodeBalancerClientFilter响应式负载均衡代理
- centos7安装yum_centos7下yum方式安装jenkins
- loadrunner-2-9添加事务
- 优秀渐变色彩应用PSD分层海报模板,大神都是这样玩渐变的,一看就懂
- MediaElement 4.1.3 发布,HTML5 音视频解决方案
- 「管理数学基础」4.2 模糊数学:扩张原理、模糊数、可能性分布与模糊概率
- java File类入门学习
- 快速部署简单私有云CloudStack(下)
- fileurlwithpath urlwithstring 这俩有啥区别吗
- Delphi2010的组件/控件
- Nero Burning Rom V6多区段刻录详解
- 项目开发:网上书店(详细的开发流程记录)----注册登录功能,通过邮件验证
- 关于axure 8在发布的时候显示:Unable to connect to Axure Share.的问题
- 继暗影机器人跑路,守护者群管作者也宣布退网
- 计算机标准差平方差怎么按,数学标准差公式
- 植物大战僵尸pak修改
- 西安交大计算机814大纲,西安交大考研辅导班:西安交通大学2020年809电子技术基础考研科目参考书目及考试大纲...
热门文章
- 博彦科技面试题笔试题
- 入侵检测---IDS
- VisualStudio 2017:connot open source file XXX.h 以及The Windows SDK version 10.0.17134.0 was not found
- java-php-python-ssm如家酒店管理系统计算机毕业设计
- MacBook 设置HEIC动态壁纸
- vs2008下搭建qt开发环境
- 遭遇Trojan.Alipop,microinfo.dll,gofwk.pic,game.dll,qpjmy.exe,nnaa.exe,SafeDrv.exe等1
- 《Dreamweaver CS6 完全自学教程》笔记 第十二章:框架的应用
- Matlab中的复数运算函数
- 会计学原理学习笔记——第一章——总论(1.6会计假设)