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

   2015-08-16 0
核心提示:本篇文章是对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         

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • MYSQL-实现ORACLE- row_number() over(partitio
    MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能   由于MYSQL没有提供类似ORACLE中OVER()这样丰富的分析函数. 所以在MYSQL里需要实现这样的功能,我们只能用一些灵活的办法:1.首先我们来创建实例数据:drop table if exists heyf_t10;crea
    02-10
  • MySQL的SQL_CALC_FOUND_ROWS真的很慢么? SQL_C
    分页程序一般由两条SQL组成:SELECT COUNT(*) FROM ... WHERE ....SELECT ... FROM ... WHERE LIMIT ...  如果使用SQL_CALC_FOUND_ROWS的话,一条SQL就可以了:SELECT SQL_CALC_FOUND_ROWS ... FROM ... WHERE LIMIT ...  在得到数据后,通过FOUND_ROWS()
    02-10
  • 由于row_number() over 是Oracle中的函数,MySQL如何实现相同功能?
    由于row_number() over 是Oracle中的函数,MySQ
    示例:想要取出每个课程前3名的学生信息、课程id,成绩与对应课程内排名创建student表:s_id为学生id,s_name为学生姓名,s_sex为性别创建score表:s_id 为学生id,c_id为课程id,s_score为对应的成绩  #内嵌部分:set @rank:=0;select *, @rank:=case when
    02-10
  • mysql row模式查看原始sql
    得设置:binlog_rows_query_log_events=1
    02-09
  • mysql中实现行号,oracle中的rowid oracle sele
     mysql中实现行号需要用到MYSQL的变量,因为MySql木有rownumber。 MYSQL中变量定义可以用set @var=0或set @var:=0 可以用=或:=都可以,但是如果变量用在其他语句中,如:select那么必须用:=,因为=会被当作一个比较符号 1 select @rownum:=@rownum+1 as ro
    02-09
  • SQL分页排序的实现与分页数据重复问题——以Ora
    对于关系数据库来说,直接写SQL拉数据在列表中显示是很常用的做法。但如此便带来一个问题:当数据量大到一定程度时,系统内存迟早会耗光。另外,网络传输也是问题。如果有1000万条数据,用户想看最后一条,这时即便有足够的内存,在网络上传输这么多数据也得
    02-09
  • [转载]Oracle数据库 sql%found,sql%notfound,sq
    sql%found,sql%notfound,sql%rowcount 在执行DML(insert,update,delete)语句时,可以用到以下三个隐式游标(游标是维护查询结果的内存中的一个区域,运行DML时打开,完成时关闭,用sql%isopen检查是否打开):sql%found (布尔类型,默认值为null)sql%n
    02-09
  • Oracle SQL篇(三)Oracle ROWNUM 与TOP N分析
        首先我们来看一下ROWNUM:含义解释:1、rownum是oracle为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推。这是一个伪列,可以用于限制查询返回的总行数。2、rownum不能以任何基表的名称作为前缀。对于ROWNUM来说,通常我们可以使
    02-09
  • SQL Server使用row_number分页的实现方法
    这篇文章主要为大家详细介绍了SQL Server使用row_number分页的实现方法,具有一定的参考价值,感兴趣的朋友可以参考一下
  • Oracle开发之分析函数(Rank, Dense_rank, row_n
    本文主要是对Oracle分析函数Rank, Dense_rank, row_number的使用法,通过这些函数,我们可以对数据进行排序和分组,需要的朋友可以参考下。
点击排行