1. 程式人生 > >oracle最全面的分析函式over(Partition by...)及開窗函式詳解

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