Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15635
  • 博文数量: 13
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-07 20:38
个人简介

Seed

文章分类
文章存档

2017年(4)

2016年(9)

我的朋友

分类: Oracle

2016-10-19 13:29:39

row_number()over(partition by col1 order bycol2)表示根据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    
---------- ---------- --------- ----------    
         1SMITH     CLERK             1    
         2ALLEN     SALESMAN          2    
         3WARD      SALESMAN          3    
         4JONES     MANAGER           4    
         5MARTIN    SALESMAN          5    
         6BLAKE     MANAGER           6    
         7CLARK     MANAGER           7    
         8SCOTT     ANALYST           8    
         9KING      PRESIDENT         9    
        10 TURNER    SALESMAN         10    
        11ADAMS     CLERK            11    
        12JAMES      CLERK            12    
        13FORD      ANALYST          13    
        14 MILLER    CLERK            14  
如果没有partition by子句结果集将是按照orderby 指定的列进行排序; 
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)    
-- ---------- --------------------------    
1one                                3    
4four                               2    
5 five                               1    
13thirteen                           4    
22 twentytwo                         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 byb) row_number    
from row_number_test    
order by a;  
  
这个例子中,我们先按照c列分组,分为2('*','+') 
再按照每个小组的b列进行排序(按字符串首字母的ascii码排), 
最后按照a列排序,得到下面的结果集
A B         ROW_NUMBER    
-- ---------- ----------    
1one                3    
4four               2    
5five               1    
13 thirteen           1    
22 twenty two      
阅读(371) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~