--已知:两种排名方式(分区和不分区):使用和不使用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()函数排名相关推荐

  1. Oracle中rank() over, dense_rank(), row_number() 的区别

    Oracle中rank() over, dense_rank(), row_number() 的区别 假设现在有一张学生表student,学生表中有姓名.分数.课程编号,现在我需要按照课程对学生的成绩 ...

  2. Oracle中ROW_NUMBER() OVER()函数用法

    Oracle中ROW_NUMBER() OVER()函数用法 1. 说明:ROW_NUMBER() OVER() 函数的作用:分组排序 2. 原理: row_number() over() 函数,ov ...

  3. oracle数据库rank over用法,Oracle中rank() over, dense_rank(), row_number() 的区别

    Oracle中rank() over, dense_rank(), row_number() 的区别 假设现在有一张学生表student,学生表中有姓名.分数.课程编号,现在我需要按照课程对学生的成绩 ...

  4. oracle分类函数总结,oracle中分组排序函数用法

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

  5. oracle怎么声明nvl函数,[转载]Oracle中的NVL函数

    Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...

  6. oracle 条件排序函数,oracle中分组排序函数

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

  7. oracle求和分组排序,oracle中分组排序函数用法 - 转

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

  8. oracle中存储过程和函数有什么区别,Oracle中存储过程和函数的区别

    Oracle中存储过程和函数的区别 存储过程和函数:  www.2cto.com 例子: [sql] //创建过程 create or replace procedure add_emailinfo( ...

  9. oracle substr(table),oracle中的substr()函数

    SUBSTR(cExpression,nStartPosition [,nCharactersReturned]) 其中,cExpression指定要从其中返回字符串的字符表达式或备注字段: nSta ...

最新文章

  1. Nginx HTTPS功能部署实践
  2. BIEE多层表头报表的制作方法
  3. 【深度学习】修改每张人像---ImageNet 的衰落
  4. ReactiveLodeBalancerClientFilter响应式负载均衡代理
  5. centos7安装yum_centos7下yum方式安装jenkins
  6. loadrunner-2-9添加事务
  7. 优秀渐变色彩应用PSD分层海报模板,大神都是这样玩渐变的,一看就懂
  8. MediaElement 4.1.3 发布,HTML5 音视频解决方案
  9. 「管理数学基础」4.2 模糊数学:扩张原理、模糊数、可能性分布与模糊概率
  10. java File类入门学习
  11. 快速部署简单私有云CloudStack(下)
  12. fileurlwithpath urlwithstring 这俩有啥区别吗
  13. Delphi2010的组件/控件
  14. Nero Burning Rom V6多区段刻录详解
  15. 项目开发:网上书店(详细的开发流程记录)----注册登录功能,通过邮件验证
  16. 关于axure 8在发布的时候显示:Unable to connect to Axure Share.的问题
  17. 继暗影机器人跑路,守护者群管作者也宣布退网
  18. 计算机标准差平方差怎么按,数学标准差公式
  19. 植物大战僵尸pak修改
  20. 西安交大计算机814大纲,西安交大考研辅导班:西安交通大学2020年809电子技术基础考研科目参考书目及考试大纲...

热门文章

  1. 博彦科技面试题笔试题
  2. 入侵检测---IDS
  3. VisualStudio 2017:connot open source file XXX.h 以及The Windows SDK version 10.0.17134.0 was not found
  4. java-php-python-ssm如家酒店管理系统计算机毕业设计
  5. MacBook 设置HEIC动态壁纸
  6. vs2008下搭建qt开发环境
  7. 遭遇Trojan.Alipop,microinfo.dll,gofwk.pic,game.dll,qpjmy.exe,nnaa.exe,SafeDrv.exe等1
  8. 《Dreamweaver CS6 完全自学教程》笔记 第十二章:框架的应用
  9. Matlab中的复数运算函数
  10. 会计学原理学习笔记——第一章——总论(1.6会计假设)