sql中的開窗函式:複雜查詢需求的簡單處理
技術標籤:sql
1、開窗函式與普通聚合函式區別
開窗是用來解決傳統的要通過複雜的相關子查詢或者儲存過程來完成的業務場景
普通的聚合函式聚合的行集是組,開窗函式聚合的行集是視窗。
普通的聚合函式每組(Group by)只返回一個值,而開窗函式則可為視窗中的每行都返回一個值。
對查詢的結果多出一列,這一列可以是聚合值,也可以是排序值。 開窗函式一般分為兩類,聚合開窗函式和排序開窗函式。
在同一個SELECT語句中可以同時使用多個開窗函式,而且這些開窗函式並不會相互干擾
2、構建測試資料
[職工姓名|部門編號|職工ID|工資|崗位型別|入職時間] Michael|1000|100|5000|full|2014-01-29 Will|1000|101|4000|full|2013-10-02 Wendy|1000|101|4000|part|2014-10-02 Steven|1000|102|6400|part|2012-11-03 Lucy|1000|103|5500|full|2010-01-03 Lily|1001|104|5000|part|2014-11-29 Jess|1001|105|6000|part|2014-12-02 Mike|1001|106|6400|part|2013-11-03 Wei|1002|107|7000|part|2010-04-03 Yun|1002|108|5500|full|2014-01-29 Richard|1002|109|8000|full|2013-09-01 CREATETABLEIFNOTEXISTSemployee( namestring, dept_numint, employee_idint, salaryint, typestring, start_datedate ) ROWFORMATDELIMITED FIELDSTERMINATEDBY'|' STOREDasTEXTFILE; loaddatalocalinpath'/opt/datas/employee_contract.txt'intotableemployee;
3、開窗函式
語法:與聚合函式不同的是,開窗函式在聚合函式後增加了一個 OVER 關鍵字
開窗函式格式: 函式名(列) OVER(選項)
OVER 關鍵字表示把函式當成開窗函式而不是聚合函式。SQL 標準允許將所有聚合函式用做開窗函式,使用OVER 關鍵字來區分這兩種用法。
開窗函式COUNT(*) OVER()對於查詢結果的每一行都返回所有符合條件的行的條數。OVER 關鍵字後的括號中還經常新增選項用以改變進行聚合運算的視窗範圍。如果OVER 關鍵字後的括號中的選項為空,則開窗函式會對結果集中的所有行進行聚合運算。PARTITION BY 子句:
開窗函式的 OVER 關鍵字後括號中的可以使用 PARTITION BY 子句來定義行的分割槽來供進行聚合計算
。與 GROUP BY 子句不同,PARTITION BY 子句建立的分割槽是獨
立於結果集的,建立的分割槽只是供進行聚合計算的,而且不同的開窗函式所建立的分割槽也不互相影響
3.1 聚合:count、sum、min、max、avg、first_value、last_value、lag、lead、cume_dist
- count: 統計分割槽中行的個數 語法:
- sum: 累加指定分割槽中的值
- min:找出指定分割槽中的最小值
- max:找到指定分割槽內的最大值
- avg:計算分割槽的平均值
- first_value:返回分割槽中的某一列第一個值
語法:FIRST_VALUE(col) over (partition by col1 order by col2)
- last_value:返回分割槽中的某一列最後一個值、預設視窗是從第一條到當前條(累計到當前行)
語法:LAST_VALUE(col) over (partition by col1 order by col2)
- lag:取某個分割槽某一列的前N個值
語法:LAG(col,N,defaultValue) over (partition by col1 order by col2)
- lead:取每個分割槽內某列的後N個值
語法:FIRST_VALUE(col) over (partition by col1 order by col2)
- cume_dist: