Oracle的分析函数

Posted 有钱了就养只金毛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle的分析函数相关的知识,希望对你有一定的参考价值。

Oracle的分析函数row_number(),rank(),dense_rank()的用法与区别

比如查询工资排名第7的员工信息,可以用分析函数来做。

--查询工资排名第7的员工信息
select *
  from (select emp.*, rank() over(order by sal desc) rank from emp)
 where rank = 7;
 
select *
  from (select emp.*, dense_rank() over(order by sal desc) dr from emp)
 where dr = 7;
 
select *
  from (select emp.*, row_number() over(order by sal desc) rn from emp)
 where rn = 7;

但他们的用法还是有区别的,这3个函数的唯一区别在于当碰到相同数据时的排名策略。

①ROW_NUMBER:

Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。 

②DENSE_RANK:
Dense_rank函数返回一个唯一的值,除非当碰到相同数据时,此时所有相同数据的排名都是一样的。 

③RANK:
Rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。

依次贴图说明:

row_number函数排序  dense_rank函数排序  rank()函数排序

从图中可以看出,rownum遇到的数据无论是否相同,都按照顺序排序;dense_rank当遇到相同数据时,相同数据的排名是相同的,但会空出相应的排名;rank遇到相同的数据时,相同的数据排名相同,且不会空出相应的排名。

 

over()函数不能单独使用,必须和分析函数或者聚合函数一起使用

 

例如员工表中分部门进行排序

select ename,
       deptno,
       dense_rank() over(partition by deptno order by sal) dr
  from emp;

 over函数和sum函数一起使用可以实现连续求和

select ename,
       deptno,
       sal,
       sum(sal) over(partition by deptno order by ename) part_sum
  from emp;

 over()函数是一个窗口说明函数,用来说明前面所接函数的限制条件,如果over函数中无条件,则求的是所有员工的工资总和

select ename,
       deptno,
       sal,
       sum(sal) over()
  from emp;

 

以上是关于Oracle的分析函数的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

sql Oracle代码片段

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段

如何在 Toad for Oracle 中使用自定义代码片段?

ORACLE统计分析函数

使用分析函数 Oracle 分组