分析函數語法: 函數
例: 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()是跳躍排序,有兩個第二名時接下來就是第四名;