OVER PARTITION BY 函式介紹

2022-08-27 14:39:12 字數 4407 閱讀 4394

鏈結

開窗函式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 返回本地當...