sql開窗函式

2022-09-06 19:15:14 字數 3380 閱讀 5865

mysql8.0之前的版本是不支援開窗函式的,8.0之後才支援。

開窗函式與聚合函式的計算方式一樣,也是對行集組進行聚合計算,但是它不像普通聚合函式那樣每組只返回乙個值,開窗函式可以為每組返回多個值。

假設有乙個員工資訊表worker,資料如下圖一。如果我們要計算所有人或者每個年齡的平均工資,可通過聚合函式**g(salary) …group by...實現,如下圖二和圖三。我們知道聚合函式select中的列除了聚合函式,其他列必須通過group by去分組,即通過聚合函式得到的結果,只能顯示聚合列、和通過聚合列聚合出來的值,無法檢視這之外的其他資訊。如下圖三,只能檢視每個年齡和對應年齡的平均工資,無法同時檢視每個人的姓名和城市(當然通過子查詢可以實現)。開窗函式就可以解決這個問題。

開窗函式的語法為:

function(column1)

over( [partition by column2]  -----分割槽元素

[order by column3]           -----排序元素

[row|range ......] )        -----框架元素

partition by 和order by 可以省略也可以只出現乙個。

開窗函式主要分為兩類,聚合開窗函式和排名開窗函式。

sql 標準允許將所有聚合函式用做開窗函式,使用over()關鍵字來區分這兩種用法,over()關鍵字表示把函式當成開窗函式而不是聚合函式。

如果over()括號中的引數為空,開窗函式會對結果集中的所有行進行聚合運算。

over()中的partition by子句用於定義行的分割槽來供進行聚合計算。與group by子句不同,partition by子句建立的分割槽獨立於結果集,而且不同的開窗函式建立的分割槽互不影響。

over()中的order by子句用於指定排序規則,有的開窗函式要求必須指定排序規則。使用order by子子句可以對結果集按照指定的排序規則進行排序,並且在乙個指定的範圍內進行聚合運算。

order by子句語法:order by column range|rows between 邊界規則1 and 邊界規則2,紅色標記部分用來定位聚合計算範圍,又被稱為定位框架。

rows表示按照行的範圍進行範圍的定義,range表示按照值的範圍進行範圍的定義,邊界規則的可取值如下:

示例1:按工資排序,並求第一行到當前行的累計工資。

select

*,sum(salary) over(order

by salary rows between unbounded preceding and

current row) 累計工資 from

worker;

rows between unbounded preceding and current row是開窗函式中最常使用的定位框架,表示從第一行到當前行。

示例2:將示例中的row改成range,如下

/*

方法1*/

select

*,sum(salary) over(order

by salary range between unbounded preceding and

current row) 累計工資 from

worker;

/*方法2

*/select

*,sum(salary) over(order

by salary) 累計工資 from worker;

rows是按行定位,range是按值定位,這兩個不同的定位方式主要在於處理並列排序的情況。

partition by和order by結合使用

主要有三個,row_number()、rank()、dense_rank(),它們的主要區別在於對並列值的處理規則不同。

使用上述三個函式,對員工資訊表按照工資排序,sql語句和輸出結果如下。

row_number():不處理並列的情況,得到的結果連續遞增。

rank():相同的值排序相同,但接下來的序號會跳過

dense_rank():相同的值排序相同,接下來的序號順序遞增

SQL開窗函式

有關排名排序的三種常用視窗函式 1 select rank over order by scores desc from table 這種排序是允許並列,並且保留空缺,兩個第1名,沒有第2名,排名是1,1,3 2 select dense rank over order by scores desc...

sql函式 開窗函式簡介

與聚合函式一樣,開窗函式也是對行集組進行聚合計算,但是普通聚合函式每組只能返回乙個值,而開窗函式可以每組返回多個值。實驗一比如我們想查詢每個工資小於5000元的員工資訊 城市以及年齡 並且在每行中都顯示所有工資小於5000元的員工個數,執行下面的sql語句 select t.fcity,t.fage...

rank 開窗函式 排序類開窗函式

1,row number over 排序,連續 select score,row number over from sc 按原始 的成績順序進行排序 原始 成績順序 先將分數從大到小排序,分數相同,排名不同 select score,row number over order by score fr...