슈퍼 소 가죽 Oacle 의 분석 함수 over (Partition by...) 및 창문 열기 함수

9182 단어 Oracle
     oracle     over(Partition by...)      
    over(Partition by...)        ORACLE    。

                     。


oracle     over      
 :    over
Oracle 8.1.6        ,                 ,            
         ,               。 
              。                                       
1:         。        
     date       sale
     1           20
     2           15
     3           14
     4           18
     5           30
      :    :            
         :
    DATE   SALE       SUM
    ----- -------- ------
    1      20        20           --1            
    2      15        35           --1 +2            
    3      14        49           --1 +2 +3            
    4      18        67            .          
    5      30        97            .
     
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         
  
=====
select * from test

  :
A B C 
1 1 1 
1 2 2 
1 3 3 
2 2 5 
3 4 6 


--- B         C      
select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sum
from test

A B C C_SUM 
1 1 1 1 
1 2 2 7 
2 2 5 7 
1 3 3 3 
3 4 6 6 

---              ,     null

eg:    C    summary       

select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sum
from test

A B C C_SUM 
1 1 1 17 
1 2 2 17 
1 3 3 17 
2 2 5 17 
3 4 6 17

               

SQL> select * from salary;

NAME DEPT SAL
---------- ---- -----
a 10 2000
b 10 3000
c 10 5000
d 20 4000

SQL> select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary;

NAME DEPT SAL PERCENT
---------- ---- ----- ----------
a 10 2000 20
b 10 3000 30
c 10 5000 50
d 20 4000 100

 :               
                          ,                    ,    : 
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
   
   sum(aa)over(order by aa range between 2 preceding and 2 following)
         
            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 ...)

  
SQL> select type,qty from test;

TYPE QTY
---------- ----------
1 6
2 9

 SQL> select type,qty,to_char(row_number() over(partition by type order by qty))||'/'||to_char(count(*) over(partition by type)) as cnt2 from test;

TYPE QTY CNT2 
---------- ---------- ------------
3 1/2
1 6 2/2
2 5 1/3
7 2/3 
2 9 3/3

 SQL> select * from test;
---------- -------------------------------------------------
1 11111
2 22222
3 33333
4 44444

SQL> select t.id,mc,to_char(b.rn)||'/'||t.id)e
2 from test t,
 (select rownum rn from (select max(to_number(id)) mid from test) connect by rownum <=mid ))L
4 where b.rn<=to_number(t.id)
order by id

ID MC TO_CHAR(B.RN)||'/'||T.ID
--------- -------------------------------------------------- ---------------------------------------------------
1 11111 1/1
2 22222 1/2
2 22222 2/2
3 33333 1/3
3 33333 2/3
3 33333 3/3
 44444 1/4 44444 2/4
4 44444 3/4CNOUG4 44444 4/4

10 rows selected

*******************************************************************

  partition by

        ,   8.0      row_number() rownum   ,      (         1    ) rank()     ,               (         ) dense_rank()l     ,              。    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;



    CSDN  ,       :http://blog.csdn.net/hoho_lolo/archive/2010/03/16/5386185.aspx

좋은 웹페이지 즐겨찾기