oracle的分析函數‘over’

分析函數語法: 函數

: sum(sal) over (partition by deptno order by ename) new_alias spa

sum就是函數名 排序

(sal)是分析函數的參數,個函數有0~3個參數,參數能夠是表達式,例如:sum(sal+comm) it

over 是一個關鍵,用於標識分析函數,則查詢分析器不能區sum()彙集函數和sum()分析函數 io

分析函數用於算基於的某聚合,它和聚合函數的不一樣之是:返回多行,而聚合函數只返回一行。 ast

 

經常使用的分析函數以下所列: test

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

 

select * from test 語法

DMPNO  NAME   DPTNO    MAR     SAL im

0075     xu        D1        0082     3000

0082     bao      D1        0096     4000

0096     zhao     D2                   5000

0111     mu       D2        0082     4000

0056     zhang   D3        0111     3000

0923     wang    D3        0075     2000

0001     xiu       D1        0082     6000

0002     feng     D1        0082     7000

0005     wu       D2        0111     3000

 

select DMPNO,SAL,NAME,DPTNO,

sum(sal) over (order by name) A, --連続求和

sum(sal) over () B, -- sum(sal) over () 等同於sum(sal)

sum(sal) over (partition by dptno order by name) C, --按部門"連続"求和

sum(sal) over (partition by dptno) D --按部門求和

FROM TEST

DMPNO SAL     NAME   DPTNO       A            B            C            D

0082      4000      bao        D1         4000      37000    4000      20000

0002      7000      feng       D1         11000    37000    11000    20000

0111       4000      mu         D2         15000    37000    4000      12000

0923      2000      wang     D3         17000    37000    2000      5000

0005      3000      wu         D2         20000    37000    7000      12000

0001      6000      xiu         D1         26000    37000    17000    20000

0075      3000      xu          D1         29000    37000    20000    20000

0056      3000      zhang    D3         32000    37000    5000      5000

0096      5000      zhao      D2         37000    37000    12000    12000

 

row_number()over()  ,rank()over() dense_rank()over()函數的使用:


select name,dptno,sal,rank()over(partition by dptno order by sal desc) mm from test

--select name,dptno,sal,row_number()over(partition by dptno order by sal desc) mm from test

--select name,dptno,sal,dense_rank()over(partition by dptno order by sal desc) mm from test

NAME DPTNO SAL   MM
feng    D1      7000    1
xiu      D1      6000    2
bao    D1      4000     3
xu      D1      3000    4
zhao   D2      5000    1
mu     D2      4000    2
wu      D2      3000    3
zhang D3     3000    1
wang  D3     2000    2

注意:(select* from ① where mm='1'
    1.
在求第一名時侯:不能用row_number(),因若是有兩個並列第一,row_number()只返回一個;
    2.rank()dense_rank()
     --rank()
是跳排序,有兩個第二名接下來就是第四名;
 

相關文章
相關標籤/搜索