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

oracle中row_number() over()分析函数用法的更多相关文章

  1. Oracle中 row_number() over()分析函数(转)

    https://www.cnblogs.com/moon-jiajun/p/3530035.html

  2. Oracle中rownum的基本用法

    Oracle中rownum的基本用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且r ...

  3. Oracle 中 CONTAINS 函数的用法

    Oracle 中 CONTAINS 函数的用法 1. 查询住址在北京的学生 SELECT student_id,student_name FROM students WHERE CONTAINS( a ...

  4. [转载]Oracle中TO_NUMBER()函数的用法

    1 用法简介TO_NUMBER函数()是Oracle中常用的类型转换函数之一,主要是将字符串转换为数值型的格式,与TO_CHAR()函数的作用正好相反. To_number函数的格式如下: To_nu ...

  5. Oracle中 to_date和to_char用法

    to_date("要转换的字符串","转换的格式")   两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...

  6. Oracle中to_number()函数的用法

    to_number()函数是oracle中常用的类型转换函数之一,是将一些处理过的按一定格式编排过的字符串变回数值型的格式. 1.to_number()函数可以将char或varchar2类型的str ...

  7. oracle 中 to_date 函数的用法

    常犯错的使用方法. to_date('2019-08-12 22:05:','yyyy-MM-dd HH24:mm:ss') Oracle中会引起错误:"ORA 01810 格式代码出现两次 ...

  8. oracle中row_number()的用法

    公司系统升级的时候需要数据迁移,遇到一个问题:新表的数据结构和旧表异构,旧表是流水号,新表是联合主键(业务号码+业务号码序号) 最后发现用窗口函数 row_number() + partition b ...

  9. oracle中分组排序函数用法 - 转

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

随机推荐

  1. Delphi 创建一个url网址快捷方式代码

    procedure CreateURLShortcut(const ShortcutFile, URL: string); var F: TextFile; // text file begin {$ ...

  2. 3类与对象——重拾Java

    面向对象编程的3个特性 1 封装性 面向对象编程核心思想之一就是将数据和对数据的操作封装在一起.通过抽象,即从具体的实例中抽取共同的性质形成一般的概念,比如类的概念. 在实际生活中,我们每时每刻都在与 ...

  3. apply和call用法

    资料来源:http://blog.csdn.net/business122/article/details/8000676 Js apply方法详解 我在一开始看到javascript的函数apply ...

  4. 大型运输行业实战_day04_1_搭建ssm框架最容易犯的错误

    错误1.MapperScannerConfigurer中应该去扫描包,而不是接口 如果出现上述错误,报错如下,注意我们在看报错日志的时候一点要从 后往前看 错误2.没有配置别名,又要使用别名 命名不规 ...

  5. tomcat 管理端 安全措施

    由于公司的项目并未启用nginx负载均衡,所以自然也没用到tomcat与web应用一对一的安全操作,经常会遇到 重启单个应用又不想重启tomcat的情况.同时,又出于安全考虑,将tomcat的默认管理 ...

  6. web 前端遇到的问题

    前端小白一枚,经常遇到一些小问题,但是解决完吧,又记不住,哎,好记性不如烂笔头咯 1. 如何在js代码中设置checkbox选中? $("#select").attr('check ...

  7. python单线程下实现多个socket并发

    先看服务端的代码 import sys # import socket import time import gevent from gevent import socket from gevent ...

  8. sqlserver 几种datatime的区别

    参考文章1 smalldatetime 占4位精确到分钟.时间从1900.1.1到2079.6.6datetime占8位精确到毫秒.时间从1753.1.1到9999.12.31 参考文章2 datet ...

  9. Microsoft SQL Server, 错误:4064的解决方法 (转载)

    SQL SERVER – Fix : Error: 4064 – Cannot open user default database. Login failed. Login failed for u ...

  10. 17-js 提交表单以及判空

    js