oracle之分析函數over及開窗函數

來源:互聯網
上載者:User

一:分析函數over
Oracle從8.1.6開始提供分析函數,分析函數用於計算基於組的某種彙總值,它和彙總函式的不同之處是對於每個組返回多行,而彙總函式對於每個組只返回一行。

 

統計各班成績第一名的同學資訊

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是連續排序,有兩個第二名時仍然跟著第三名

 

 

 

二:開窗函數          
      開窗函數指定了分析函數工作的資料視窗大小,這個資料視窗大小可能會隨著行的變化而變化,舉例如下:
1:    
   over(order by salary) 按照salary排序進行累計,order by是個預設的開窗函數  
   over(partition by deptno)按照部門分區

2:
  over(order by salary range between 5 preceding and 5 following)
   每行對應的資料視窗是之前行幅度值不超過5,之後行幅度值不超過5

 

例如:對於以下列
     aa
     1
     2
     2
     2
     3    
     4

     5
     6
     7
     9

SQL>select  sum(aa)over(order by aa range between 2 preceding and 2 following) from A1;

 得出的結果是

   AA SUM
----------------------
-------------------------------------------------------

  1    10

  2  
14

  2   14

  2
  14

  3   18

  4  
18

  5   22

  6  
18

  7  
22

  9   9    

就是說,對於aa=5的一行 ,sum為 5-1<=aa<=5+2 的和
對於aa=2來說
,sum=1+2+2+2+3+4=14 ;
又如 對於aa=9 ,9-1<=aa<=9+2 只有9一個數,所以sum=9
;

 

3:其它:
over(order by salary rows between 2 preceding and 4
following)
每行對應的資料視窗是之前2行,之後4行
4:下面三條語句等效:

over(order by salary rows between unbounded preceding and unbounded
following)
每行對應的資料視窗是從第一行到最後一行,等效:
over(order by salary
range between unbounded preceding and unbounded following)

等效
over(partition by null)

 

 

 

--

 

常用的分析函數如下所列:

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 ...)

--
--
--

 

常用的分析函數如下所列:

 

1、row_number() over(partition by ... order by ...)
2、rank() over(partition by ... order by ...)
3、dense_rank() over(partition by ... order by ...)
4、count() over(partition by ... order by ...)
5、max() over(partition by ... order by ...)
6、min() over(partition by ... order by ...)
7、sum() over(partition by ... order by ...)
8、avg() over(partition by ... order by ...)
9、first_value() over(partition by ... order by ...)
10、last_value() over(partition by ... order by ...)
11、lag() over(partition by ... order by ...)
12、lead() over(partition by ... order by ...)

 

 

 

關於partition by

 

這些都是分析函數,好像是8.0以後才有的 row_number()和rownum差不多,功能更強一點(可以在各個分組內從1開時排序)
rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內)
dense_rank()是連續排序,有兩個第二名時仍然跟著第三名。

相比之下row_number是沒有重複值的 lag(arg1,arg2,arg3):
arg1是從其他行返回的運算式 arg2是希望檢索的當前行分區的位移量。是一個正的位移量,時一個往回檢索以前的行的數目。 arg3是在arg2表示的數目超出了分組的範圍時返回的值。

 

 

1.
select deptno,row_number() over(partition by deptno order by sal) from
emp order by deptno;
2.
select deptno,rank() over (partition by deptno
order by sal) from emp order by deptno;
3.
select deptno,dense_rank()
over(partition by deptno order by sal) from emp order by deptno;
4.
select
deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) from
emp ord er by deptno;
5.
select deptno,ename,sal,lag(ename,2,'example')
over(partition by deptno order by ename) from em p
order by
deptno;
6.
select deptno, sal,sum(sal) over(partition by deptno) from
emp;--每行記錄後都有總計值  select deptno, sum(sal) from emp group by deptno;
7.
求每個部門的平均工資以及每個人與所在部門的工資差額

 

select deptno,ename,sal ,
     round(avg(sal) over(partition by deptno))
as dept_avg_sal,
     round(sal-avg(sal) over(partition by deptno)) as
dept_sal_diff
from emp;

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.