Oracle排序分析函数
在Oracle自拓展SQL功能中,分析函数(Analytical Function)是非常强大的工具。
本篇我们介绍几个Oracle典型的排序分析函数,来帮助我们解决实际问题。
1、从rownum谈起
选择Oracle 11gR2进行测试

基础表EMP,并对字段 sal 排序

常见的功能需求,是先用order by排序,之后用rownum从1开始标记。但是,rownum往往不会像我们希望的如此工作。

最后的数据集合,的确是按照我们希望的sal排序动作结果。但是rownum并没有按照我们希望的出现排序"序号"作用。
这个问题的根源是Oracle rownum的机理。rownum并不是一个真实存在的数据列,而是一个随数据集生成而生成的伪数据列。rownum是oracle系统顺序分配为从查询返回的行的编号,oracle在select出一条记录后便加上一个rownum,而不等所有的结果都select出来后再加上rownum。
上面的结果,正是Oracle首先生成了rownum数据列,之后再按照sal进行排序后的结果。所以,rownum并不能像我们想象的那样处理。
一些方法可以使用在这个问题上,主要是嵌套子查询方法,让我们可以使用ronwum来解决这个问题。

结果正确,不过在官方文档中,Oracle推荐使用分析函数来解决序号问题,根据不同的实际需求,可以使用row_number()、rank()和dense_rank()几个选择。
row_number() 根据order by顺序排出一个名次,不会出现并列排名 1 2 3 4 5
rank() 根据order by排序,会出现并列排名,下一个值会跳过并列值 比如 1 2 2 4 5
desc_rank() 根据order by排序,出现并列排名以后,下一个值不跳过并列值 1 2 2 3 4
2、分析函数ROW_NUMBER()、RANK()、DENSE_RANK()
分析函数最大的一个功能是可以使用partition可选参数,用来在其中分组,这三个分析函数都可以在各个分组内从1开始排序。
ROW_NUMBER()函数是一个单纯的序号生成器,序号没有重复值,当结果有相同的排序取值时,相同值有不同的排序,可以利用它实现分页显示。
DENSE_RANK()是连续排序,当结果有相同的排序取值时,相同值有相同的排序,并且序号继续下去。
RANK()是跳跃排序,当结果有相同的排序取值时,相同值有相同的排序,并且序号跳跃继续下去,有两个第二名时接下来就是第四名(同样是在各个分组内)。
语法:ROW_NUMBER()|RANK()|DENSE_RANK() OVER(PARTITION BY COLUMN ORDER BY COLUMN ASC|DESC)

Oracle排序分析函数的更多相关文章
- Oracle 排序分析函数之ROW_NUMBER、RANK和DENSE_RANK
我们都知道分析函数功能很强大,可能需要写很复杂的标准SQL才能办到或不可能办到的事,使用分析函数却能很容易完成.我们经常会用到排序分析函数,如ROW_NUMBER,RANK,DENSE_RANK.这三 ...
- oracle的分析函数over 及开窗函数
转:http://www.2cto.com/database/201310/249722.html oracle的分析函数over 及开窗函数 一:分析函数over Oracle从8.1.6开 ...
- Oracle 10gR2分析函数
Oracle 10gR2分析函数汇总 (Translated By caizhuoyi 2008‐9‐19) 说明: 1. 原文中底色为黄的部分翻译存在商榷之处,请大家踊跃提意见: 2. 原文中淡 ...
- 超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数 (转)
http://zonghl8006.blog.163.com/blog/static/4528311520083995931317/ over(Partition by...) 一个超级牛皮的ORAC ...
- 超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数
over(Partition by...) 一个超级牛皮的ORACLE特有函数. 天天都用ORACLE,用了快2年了.最近才接触到这个功能强大而灵活的函数.真实惭愧啊! oracle的分析函数over ...
- oracle的分析函数over(Partition by...) 及开窗函数
over(Partition by...) 一个超级牛皮的ORACLE特有函数. oracle的分析函数over 及开窗函数一:分析函数overOracle从8.1.6开始提供分析函数,分析函 ...
- Oracle的分析函数
Oracle的分析函数row_number(),rank(),dense_rank()的用法与区别 比如查询工资排名第7的员工信息,可以用分析函数来做. --查询工资排名第7的员工信息select * ...
- 排序分析函数中对null的处理
--排序分析函数中对null的处理 --分析:对于null在分析函数中是升序默认是nulls last,降序默认是nulls first.如果不指定排序,那么是升序 )); ,'测试1'); ,'测试 ...
- 分组函数group by和Oracle中分析函数partition by的用法以及区别
1.分组函数group by和Oracle中分析函数partition by的用法以及区别 2.开窗函数.
随机推荐
- Java中实现Serializable接口为什么要声明serialVersionUID?
什么情况下需要修改serialVersionUID 的值? 序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化 ...
- bzoj1396
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1396 题目大意: 题解:后缀自动机,只出现一次,那么就是right值为1,那么对于一段1-- ...
- pace.js原理简介
简介: 不少童鞋可能都使用过pace.js:http://github.hubspot.com/pace/docs/welcome/ 只要在页面上引入pace.js和相关的css,并不需要对业务逻辑做 ...
- 基因探针富集分析(GSEA)& GO & pathway
http://blog.sina.com.cn/s/blog_4c1f21000100utyx.html GO是Gene Ontology的简称,是生物学家为了衡量基因的功能而而发起的一个项目,从分子 ...
- js原生设计模式——2面向对象编程之js原生的链式调用
技巧点:对象方法中返回当前对象就可以链式调用了,即方法中写return this; <!DOCTYPE html><html lang="en"><h ...
- OBJECT和EMBED标签
一.介绍: 我们要在网页中正常显示flash内容,那么页面中必须要有指定flash路径的标 签.也就是OBJECT和EMBED标签.OBJECT标签是用于windows平台的IE浏览器的,而EMBED ...
- IIS HTTP重定向到HTTPS
最近客户一个网站升级至HTTPS协议访问,但是为了用户输入,客户要求当用户输入的是HTTP协议时,能自动定向到HTTPS,类似百度网站,当你输入www.baidu.com并回车后,地址栏自动变成了ht ...
- jq操作radio,设置选中、获取选中值
<label><inputtype="radio"name="sex"value="1">男</label&g ...
- Sublime3 中在行尾增加一个分号的方法
1,自己录制一个宏,名称为add comma to end.sublime-macro,宏内容如下: [ { "args": { "extend": false ...
- Session是否为新建情况的判断
Session是否为新建情况的判断: Xml: <?xml version="1.0" encoding="UTF-8"?> <web-app ...