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






你可能感兴趣的:(oracle/mysql数据库)