Oracle中rank,over partition函数的使用方法

 更新时间:2016年05月26日 09:33:03   作者:秦风  
本文主要介绍Oracle中rank,over partition函数的用法,希望对大家有所帮助。

排列(rank())函数。这些排列函数提供了定义一个集合(使用 PARTITION 子句),然后根据某种排序方式对这个集合内的元素进行排列的能力,下面以scott用户的emp表为例来说明rank over partition如何使用。

1)查询员工薪水并连续求和

select deptno,ename,sal,

sum(sal)over(order by ename) sum1, 
sum(sal)over() sum2,             
100* round(sal/sum(sal)over(),4) "bal%"
from emp

结果如下:

    DEPTNO ENAME             SAL       SUM1       SUM2       bal%
---------- ---------- ---------- ---------- ---------- ----------
        20 ADAMS            1100       1100      29025       3.79
        30 ALLEN            1600       2700      29025       5.51
        30 BLAKE            2850       5550      29025       9.82
        10 CLARK            2450       8000      29025       8.44
        20 FORD             3000      11000      29025      10.34
        30 JAMES             950      11950      29025       3.27
        20 JONES            2975      14925      29025      10.25
        10 KING             5000      19925      29025      17.23
        30 MARTIN           1250      21175      29025       4.31
        10 MILLER           1300      22475      29025       4.48
        20 SCOTT            3000      25475      29025      10.34

    DEPTNO ENAME             SAL       SUM1       SUM2       bal%
---------- ---------- ---------- ---------- ---------- ----------
        20 SMITH             800      26275      29025       2.76
        30 TURNER           1500      27775      29025       5.17
        30 WARD             1250      29025      29025       4.31

 

2)如下:

select deptno,ename,sal,
sum(sal)over(partition by deptno order by ename) sum1,
sum(sal)over(partition by deptno) sum2,
sum(sal)over(partition by deptno order by sal) sum3,
100* round(sal/sum(sal)over(),4) "bal%"
from emp

结果如下:

    DEPTNO ENAME             SAL       SUM1       SUM2       SUM3       bal%
---------- ---------- ---------- ---------- ---------- ---------- ----------
        10 CLARK            2450       2450       8750       3750       8.44
        10 KING             5000       7450       8750       8750      17.23
        10 MILLER           1300       8750       8750       1300       4.48
        20 ADAMS            1100       1100      10875       1900       3.79
        20 FORD             3000       4100      10875      10875      10.34
        20 JONES            2975       7075      10875       4875      10.25
        20 SCOTT            3000      10075      10875      10875      10.34
        20 SMITH             800      10875      10875        800       2.76
        30 ALLEN            1600       1600       9400       6550       5.51
        30 BLAKE            2850       4450       9400       9400       9.82
        30 JAMES             950       5400       9400        950       3.27

    DEPTNO ENAME             SAL       SUM1       SUM2       SUM3       bal%
---------- ---------- ---------- ---------- ---------- ---------- ----------
        30 MARTIN           1250       6650       9400       3450       4.31
        30 TURNER           1500       8150       9400       4950       5.17
        30 WARD             1250       9400       9400       3450       4.31

3)如下:

select empno,deptno,sal,
sum(sal)over(partition by deptno) "deptSum",
rank()over(partition by deptno order by sal desc nulls last) rank,
dense_rank()over(partition by deptno order by sal desc nulls last) d_rank,
row_number()over(partition by deptno order by sal desc nulls last) row_rank
from emp

注:

rang()函数主要用于排序,并给出序号

dense_rank():功能同rank()一样,区别在于,rank()对于排序并的数据给予相同序号,接下来的数据序号直接跳中跃,dense_rank()则不是,比如数据:1,2,2,4,5,6.。。。。这是rank()的形式

1,2,2,3,4,5,。。。。这是dense_rank()的形式

1,2,3,4,5,6.。。。。。这是row_number()函数形式

row_number()函数则是按照顺序依次使用,相当于我们普通查询里的rownum值

其实从上面三个例子当中,不难看出over(partition by ... order by ...)的整体概念,我理解是

partition by:按照指字的字段分区,如果没有则针对全体数据
order by:按照指定字段进行连续操作(如求和(sum),排序(rank()等),如果没有指定,就相当于对指定分区集合内的数据进行整体sum操作。

以上就是rank,over partition函数的基本使用方法,希望对大家有所帮助。

相关文章

  • Oracle数据库数据迁移完整解决步骤

    Oracle数据库数据迁移完整解决步骤

    我们常常需要对数据进行迁移,迁移到更性能配置更高级的主机OS上、迁移到远程的机房、迁移到不同的平台下,这篇文章主要给大家介绍了关于Oracle数据库数据迁移的相关资料,需要的朋友可以参考下
    2024-02-02
  • oracle重置序列从0开始递增1

    oracle重置序列从0开始递增1

    这篇文章介绍了oracle重置序列的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • Oracle 存储过程发送邮件实例学习

    Oracle 存储过程发送邮件实例学习

    接下来将介绍下如何使用存储过程发送邮件这一案例实现,感兴趣的你可以参考下本文或许对你有所帮助
    2013-03-03
  • Oracle全角数字转换半角数字

    Oracle全角数字转换半角数字

    今天小编就为大家分享一篇关于Oracle全角数字转换半角数字,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • oracle数据库迁移到MySQL的方法总结

    oracle数据库迁移到MySQL的方法总结

    本文主要总结了oracle数据库迁移到MySQL的方法,方法包括手动方式导入导出、使用工具Navicat 进行导入、使用工具DBMover 的OracleToMySQL 进行导入和使用工具intelligent-converters 的 oracle-to-mysql 进行导入,需要的朋友可以参考下。
    2017-03-03
  • oracle使用索引与不使用索引的性能详析

    oracle使用索引与不使用索引的性能详析

    索引是建立在表的一列或多个列上的辅助对象,目的是加快訪问表中的数据,下面这篇文章主要给大家分析介绍了关于oracle使用索引与不使用索引的性能的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-10-10
  • oracle 安装与SQLPLUS简单用法

    oracle 安装与SQLPLUS简单用法

    安装oracle数据库成功之后,会显示相关的数据库信息
    2009-06-06
  • 解析jdbc处理oracle的clob字段的详解

    解析jdbc处理oracle的clob字段的详解

    本篇文章是对jdbc处理oracle的clob字段进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 关于Oracle数据库dbLink的创建和使用详解

    关于Oracle数据库dbLink的创建和使用详解

    这篇文章主要介绍了关于Oracle数据库dbLink的创建和使用详解,Oracle的数据库链路dbLink是一种允许在两个不同的数据库实例之间进行通信和数据交换的功能,它可以让你在一个数据库中访问另一个数据库的对象和数据,需要的朋友可以参考下
    2023-08-08
  • win10系统安装oracle11g时遇到INS-13001环境不满足最低要求解决办法

    win10系统安装oracle11g时遇到INS-13001环境不满足最低要求解决办法

    这篇文章主要介绍了win10系统安装oracle11g时遇到INS-13001环境不满足最低要求解决办法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-09-09

最新评论