分享好友 数据库首页 频道列表

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

Oracle教程  2015-08-16 10:190
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教程】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能
MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能   由于MYSQL没有提供类似ORACLE中OVER()这样丰富的分析函数. 所以在MYSQL里需要实现这样的功能,我们只能用一些灵活的办法:1.首先我们来创建实例数据:drop table if exists heyf_t10;crea

0评论2023-02-10542

MySQL的SQL_CALC_FOUND_ROWS真的很慢么? SQL_CALC_FOUND_ROWS
分页程序一般由两条SQL组成:SELECT COUNT(*) FROM ... WHERE ....SELECT ... FROM ... WHERE LIMIT ...  如果使用SQL_CALC_FOUND_ROWS的话,一条SQL就可以了:SELECT SQL_CALC_FOUND_ROWS ... FROM ... WHERE LIMIT ...  在得到数据后,通过FOUND_ROWS()

0评论2023-02-10378

mysql row模式查看原始sql
得设置:binlog_rows_query_log_events=1

0评论2023-02-09456

mysql中实现行号,oracle中的rowid oracle select 行号
 mysql中实现行号需要用到MYSQL的变量,因为MySql木有rownumber。 MYSQL中变量定义可以用set @var=0或set @var:=0 可以用=或:=都可以,但是如果变量用在其他语句中,如:select那么必须用:=,因为=会被当作一个比较符号 1 select @rownum:=@rownum+1 as ro

0评论2023-02-09884

SQL分页排序的实现与分页数据重复问题——以Oracle rownum为例
对于关系数据库来说,直接写SQL拉数据在列表中显示是很常用的做法。但如此便带来一个问题:当数据量大到一定程度时,系统内存迟早会耗光。另外,网络传输也是问题。如果有1000万条数据,用户想看最后一条,这时即便有足够的内存,在网络上传输这么多数据也得

0评论2023-02-09983

[转载]Oracle数据库 sql%found,sql%notfound,sql%rowcount
sql%found,sql%notfound,sql%rowcount 在执行DML(insert,update,delete)语句时,可以用到以下三个隐式游标(游标是维护查询结果的内存中的一个区域,运行DML时打开,完成时关闭,用sql%isopen检查是否打开):sql%found (布尔类型,默认值为null)sql%n

0评论2023-02-09321

Oracle SQL篇(三)Oracle ROWNUM 与TOP N分析
    首先我们来看一下ROWNUM:含义解释:1、rownum是oracle为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推。这是一个伪列,可以用于限制查询返回的总行数。2、rownum不能以任何基表的名称作为前缀。对于ROWNUM来说,通常我们可以使

0评论2023-02-09907

SQL Server使用row_number分页的实现方法
这篇文章主要为大家详细介绍了SQL Server使用row_number分页的实现方法,具有一定的参考价值,感兴趣的朋友可以参考一下

0评论2016-06-20523

Oracle开发之分析函数(Rank, Dense_rank, row_number)
本文主要是对Oracle分析函数Rank, Dense_rank, row_number的使用法,通过这些函数,我们可以对数据进行排序和分组,需要的朋友可以参考下。

0评论2016-06-20105

Oracle数据库rownum和row_number的不同点
在Oracle中,有一个很有趣的东西,那就是rownum。当你从某个表中查询数据的时候,返回的结果集中都会带有rownum这个字段,而且有时候也可以使用rownum进行一些条件查询

0评论2015-11-20141

oracle的rownum深入解析
本文将详细介绍oracle的rownum的使用细节,需要的朋友可以参考下

0评论2015-11-08140

利用ROW_NUMBER() OVER函数给SQL数据库中每一条记录分配行号的方法
这篇文章主要介绍了利用ROW_NUMBER() OVER函数给SQL数据库中每一条记录分配行号的方法,需要的朋友可以参考下

0评论2015-11-07109

Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法
Oracle分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法,需要的朋友可以参考下。

0评论2015-09-20134

Oracle row_number() over()解析函数高效实现分页
Oracle row_number() over()解析函数高效实现分页,需要的朋友可以参考下。

0评论2015-09-2099

使用row_number()实现分页实例
或许大家不知道,其实使用row_number()是可以实现分页的,下面有个不错的示例,大家可以尝试操作下

0评论2015-08-0155

Oracle中使用Rownum分页详细例子
这篇文章主要介绍了Oracle中使用Rownum分页详细例子,本文将分别展示使用rownum伪列和row_number()分析函数来完成Oracle数据分页操作的具体使用方法,需要的朋友可以参考下

0评论2015-07-1085

随机获取oracle数据库中的任意一行数据(rownum)示例介绍
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀

0评论2015-07-1059

Oracle查询语句中rownum与rowid的不同之处分析
这篇文章主要介绍了Oracle查询语句中rownum与rowid的不同之处分析,需要的朋友可以参考下

0评论2015-07-06153

更多推荐