oracle最全面的分析函数over(Partition by...)及开窗函数详解

大型项目中通常会涉及到统计分析相关的功能,今天笔者把oracle常用的分析函数用法和区别通过详细的案例整理出来,希望对各位同学有帮助,也算是对自己的一个重新温故。

常用的分析函数如下所列:
row_number() over(partition by ... order by ...)
rank() over(partition by ... order by ...)
dense_rank() over(partition by ... order by ...)
count() over(partition by ... order by ...)
max() over(partition by ... order by ...)
min() over(partition by ... order by ...)
sum() over(partition by ... order by ...)
avg() over(partition by ... order by ...)
first_value() over(partition by ... order by ...)
last_value() over(partition by ... order by ...)
lag() over(partition by ... order by ...)
lead() over(partition by ... order by ...)

一:分析函数over
Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。 

下面通过几个例子来说明其应用。

1、统计某商店的营业额。        
     date       sale
     1           20
     2           15
     3           14
     4           18
     5           30

    规则:按天统计:每天都统计前面几天的总额,得到的结果:

select day,sale,sum(sale) over (order by day asc ) as 连续求和,sum(sale) over() as 总和 from t_temp;
2、统计各班成绩第一名的同学信息

  NAME   CLASS   S                         
    ----- ----- ---------------------- 
    fda       1      80                     
    ffd       1      78                     
    dss      1      95                     
    cfe       2      74                     
    gds      2      92                     
    gf        3      99                     
    ddd     3      99                     
    adf      3      45                     
    asdf    3      55                     

    3dd     3      78

 select * from                                                                       
    (                                                                            
    select name,class,s,rank()over(partition by class order by s desc) mm from t2
    )                                                                            
    where mm=1 
得到结果:
    NAME   CLASS    S                     MM                                                                                        
    ----- ----- ---------------------- ---------------------- 
    dss         1          95                      1                      
    gds        2          92                      1                      
    gf           3          99                       1                      
    ddd        3         99                       1   
注意:
    1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果         
    2.rank()和dense_rank()的区别是:
      --rank()是跳跃排序,有两个第二名时接下来就是第四名

      --dense_rank()l是连续排序,有两个第二名时仍然跟着第三名

3.分类统计 (并显示信息)
    A   B   C                      
    -- -- ---------------------- 
    m   a   2                      
    n   a   3                      
    m   a   2                      
    n   b   2                      
    n   b   1                      
    x   b   3                      
    x   b   2                      
    x   b   4                      
    h   b   3 
   select a,c,sum(c)over(partition by a) from t2                
   得到结果:
   A   B   C        SUM(C)OVER(PARTITIONBYA)      
   -- -- ------- ------------------------ 
   h   b   3        3                        
   m   a   2        4                        
   m   a   2        4                        
   n   a   3        6                        
   n   b   2        6                        
   n   b   1        6                        
   x   b   3        9                        
   x   b   2        9                        
   x   b   4        9  
  如果用sum,group by 则只能得到
   A   SUM(C)                            
   -- ---------------------- 
   h   3                      
   m   4                      
   n   6                      
   x   9                      

   无法得到B列值       

https://www.cnblogs.com/dongyj/p/5992083.html






  • 28
    点赞
  • 203
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值