深入探讨:oracle中row_number() over()分析函数用法

 更新时间:2013年05月30日 09:42:32   作者:  
本篇文章是对oracle中row_number() over()分析函数的用法进行了详细的分析介绍,需要的朋友参考下
row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。
与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码。
row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开始排序)。
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)
dense_rank()也是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的。
oracle 分析函数 row_number(),返回一个整数值(>=1);
语法格式:
1.row_number() over (order by col_1[,col_2 ...])
作用:按照col_1[,col_2 ...]排序,返回排序后的结果集,
此用法有点像rownum,为每一行返回一个不相同的值:
复制代码 代码如下:

select rownum,ename,job,   
    row_number() over (order by rownum) row_number   
from emp;   
    ROWNUM ENAME      JOB       ROW_NUMBER   
---------- ---------- --------- ----------   
         1 SMITH      CLERK              1   
         2 ALLEN      SALESMAN           2   
         3 WARD       SALESMAN           3   
         4 JONES      MANAGER            4   
         5 MARTIN     SALESMAN           5   
         6 BLAKE      MANAGER            6   
         7 CLARK      MANAGER            7   
         8 SCOTT      ANALYST            8   
         9 KING       PRESIDENT          9   
        10 TURNER     SALESMAN          10   
        11 ADAMS      CLERK             11   
        12 JAMES      CLERK             12   
        13 FORD       ANALYST           13   
        14 MILLER     CLERK             14 

如果没有partition by子句, 结果集将是按照order by 指定的列进行排序;
复制代码 代码如下:

with row_number_test as(   
     select 22 a,'twenty two' b from dual union all   
     select 1,'one' from dual union all   
     select 13,'thirteen' from dual union all   
     select 5,'five' from dual union all   
     select 4,'four' from dual)   
select a,b,   
       row_number() over (order by b)   
from row_number_test   
order by a; 

正如我们所期待的,row_number()返回按照b列排序的结果,
然后再按照a进行排序,才得到下面的结果:
复制代码 代码如下:

A B          ROW_NUMBER()OVER(ORDERBYB)   
-- ---------- --------------------------   
1 one                                 3   
4 four                                2   
5 five                                1   
13 thirteen                            4   
22 twenty two                          5 

2.row_number() over (partition by col_n[,col_m ...] order by col_1[,col_2 ...])
作用:先按照col_n[,col_m ...进行分组,
再在每个分组中按照col_1[,col_2 ...]进行排序(升序),
最后返回排好序后的结果集:
复制代码 代码如下:

with row_number_test as(   
     select 22 a,'twenty two' b,'*' c from dual union all   
     select 1,'one','+' from dual union all   
     select 13,'thirteen','*' from dual union all   
     select 5,'five','+' from dual union all   
     select 4,'four','+' from dual)   
select a,b,   
       row_number() over (partition by c order by b) row_number   
from row_number_test   
order by a; 

这个例子中,我们先按照c列分组,分为2组('*'组,'+'组),
再按照每个小组的b列进行排序(按字符串首字母的ascii码排),
最后按照a列排序,得到下面的结果集:
复制代码 代码如下:

A B          ROW_NUMBER   
-- ---------- ----------   
1 one                 3   
4 four                2   
5 five                1   
13 thirteen            1   
22 twenty two         

相关文章

  • ORACLE8的分区管理

    ORACLE8的分区管理

    ORACLE8的分区管理...
    2007-03-03
  • sqlplus 命令登录 Oracle数据库的多种方法

    sqlplus 命令登录 Oracle数据库的多种方法

    这篇文章主要介绍了sqlplus 命令登录 Oracle数据库的两种方法,方式一通过sql*plus 命令窗口,方式2:通过 cmd 窗口,每种方式给大家介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • ORCAL 临时创建表与删除表

    ORCAL 临时创建表与删除表

    今天这篇文章就来给大家分享ORCAL 临时创建表与删除表的相关资料,如会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。下面就跟小编一起进入文章学习起来吧
    2021-10-10
  • 对比Oracle临时表和SQL Server临时表的不同点

    对比Oracle临时表和SQL Server临时表的不同点

    这篇文章主要介绍了Oracle数据库建立临时表的相关知识以及和SQL Server临时表的不同点的对比,希望能够对您有所帮助。
    2015-09-09
  • oracle创建数据库和用户的方法

    oracle创建数据库和用户的方法

    这篇文章主要介绍了oracle创建数据库和用户的方法,mysql和sqlserver创建数据库可以直接通过create database “数据库名”,而oracle创建数据库要对应一个用户,数据库和用户一般是一一对应的,下面把oracle创建数据库和用户的步骤分享给大家。
    2015-07-07
  • oracle中commit之后进行数据回滚的方法

    oracle中commit之后进行数据回滚的方法

    这篇文章主要介绍了oracle中commit之后如何进行数据回滚,本文给大家分享两种方法,每种方法都给大家介绍的比较详细,需要的朋友可以参考下
    2021-12-12
  • 检测oracle数据库坏块的方法

    检测oracle数据库坏块的方法

    这篇文章主要介绍了检测oracle数据库坏块的方法 的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • Oracle8i和Microsoft SQL Server比较

    Oracle8i和Microsoft SQL Server比较

    Oracle8i和Microsoft SQL Server比较...
    2007-03-03
  • Oracle 11g数据库详细安装图文教程

    Oracle 11g数据库详细安装图文教程

    这篇文章主要为大家详细介绍了Oracle 11g数据库详细安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Oracle插入数据时出现ORA-00001:unique constraint问题

    Oracle插入数据时出现ORA-00001:unique constraint问题

    这篇文章主要介绍了Oracle插入数据时出现ORA-00001:unique constraint问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03

最新评论