鏈結
開窗函式oevr()用於計算基於組的某種聚合值,它和聚合函式的不同之處是:對於每個組返回多行,而聚合函式對於每個組只返回一行。
over(order by salary) 按照salary排序進行累計,order by是個預設的開窗函式
over(partition by deptno)按照部門分割槽
over(partition by deptno order by salary)
2:開窗的視窗範圍
:range
舉例:--
表示加2或2的範圍內的求和
select name,class,s, sum(s)over(order by s range between 2 preceding and 2 following) mm from t2
adf 3 45 45 --45加2減2即43到47,但是s在這個範圍內只有45
asdf 3 55 55
cfe 2 74 74
3dd 3 78 158 --78在76到80範圍內有78,80,求和得158
fda 1 80 158
gds 2 92 92
ffd 1 95 190
dss 1 95 190
ddd 3 99 198
gf 3 99 198
over(order by salary
between 5 preceding and 5 following):視窗範圍為當前行前後各移動5行。
舉例:--sum(s)over(order by s rows between 2 preceding and 2 following)
表示在上下兩行之間的範圍內
select name,class,s, sum(s)over(order by s rows between 2 preceding and 2 following) mm from t2
adf 3 45 174 (45+55+74=174)
asdf 3 55 252 (45+55+74+78=252)
cfe 2 74 332 (74+55+45+78+80=332)
3dd 3 78 379 (78+74+55+80+92=379)
fda 1 80 419
gds 2 92 440
ffd 1 95 461
dss 1 95 480
ddd 3 99 388
gf 3 99 293
range
rows
3、與over函式結合的幾個函式介紹
row_number()over()、rank()over()和dense_rank()over()函式的使用
下面以班級成績表t2來說明其應用
t2表資訊如下:
cfe 2 74
dss 1 95
ffd 1 95
fda 1 80
gds 2 92
gf 3 99
ddd 3 99
adf 3 45
asdf 3 55
3dd 3 78
select name,class,s,rank()over(partition by class order by s desc) mm from t2
where mm=1;
得到的結果是:
dss 1 95 1
ffd 1 95 1
gds 2 92 1
gf 3 99 1
注意:1.在求第一名成績的時候,不能用row_number(),因為如果同班有兩個並列第一,row_number()只返回乙個結果;
select name,class,s,row_number()over(partition by class order by s desc) mm from t2
where mm=1;
1 95 1 --95有兩名但是只顯示乙個
2 92 1
3 99 1 --99有兩名但也只顯示乙個
2.rank()和dense_rank()可以將所有的都查詢出來:
如上可以看到採用rank可以將並列第一名的都查詢出來;
rank()和dense_rank()區別:
--rank()是跳躍排序,有兩個第二名時接下來就是第四名;
select name,class,s,rank()over(partition by class order by s desc) mm from t2
dss 1 95 1
ffd 1 95 1
fda 1 80 3 --直接就跳到了第三
gds 2 92 1
cfe 2 74 2
gf 3 99 1
ddd 3 99 1
3dd 3 78 3
asdf 3 55 4
adf 3 45 5
--dense_rank()l是連續排序,有兩個第二名時仍然跟著第三名
select name,class,s,dense_rank()over(partition by class order by s desc) mm from t2
dss 1 95 1
ffd 1 95 1
fda 1 80 2 --連續排序(仍為2)
gds 2 92 1
cfe 2 74 2
gf 3 99 1
ddd 3 99 1
3dd 3 78 2
asdf 3 55 3
adf 3 45 4
--sum()over()的使用
select name,class,s, sum(s)over(partition by class order by s desc) mm from t2 --根據班級進行分數求和
dss 1 95 190 --由於兩個95都是第一名,所以累加時是兩個第一名的相加
fda 1 80 270 --第一名加上第二名的
gds 2 92 92
cfe 2 74 166
gf 3 99 198
ddd 3 99 198
3dd 3 78 276
asdf 3 55 331
adf 3 45 376
over partition by 開窗函式簡介
簡單舉例 select code,kpi type,plan value num,row number over partition by code,kpi type order by plan value num desc rowno from fs target yp kpi 分析 code,k...
陣列函式array key exists的介紹
arr array a b c d print r array key exists 0 arr echo var dump array key exists 0 arr 用isset和array key exists來判斷 有什麼區別呢?1 isset 不是函式,是語法結構 而array key ...
Python datetime包函式簡單介紹
一 datetime包 上接 7內容 1.函式 datetime 1 用法 輸入乙個日期,來返回乙個datetime類 2 格式 datetime.datetime 年,月,日,hour minute second 其中hour,minute,second可選 3 附加類方法 today 返回本地當...