與聚合函式一樣,開窗函式也是對行集組進行聚合計算,但是普通聚合函式每組只能返回乙個值,而開窗函式可以每組返回多個值。
實驗一比如我們想查詢每個工資小於5000元的員工資訊(城市以及年齡),並且在每行中都顯示所有工資小於5000元的員工個數,執行下面的sql語句
select t.fcity,t.fage,count(*) from person t where t.fsalary<這個語句顯然是錯誤的,因為count()是聚合函式,然後fname和fage欄位沒有包含分組裡面。5000
實驗二那麼,這樣寫呢?
select t.fcity,t.fage,count(*) from person t where t.fsalary<查詢結果5000
group
by t.fcity,t.fage
這與我們每行中都顯示所有工資小於5000元的員工個數這個條件是不符合的,那麼應該怎麼寫呢?
實驗三
select查詢結果:t.fcity,
t.fage,
(select
count(*) from person f where f.fsalary <
5000
)from
person t
where t.fsalary <
5000
這次的查詢結果和我們想要的結果一樣了,但是這樣寫多了乙個子查詢,非常麻煩。使用開窗函式可以大大簡化實現,下面看一下開窗函式要實現這個效果怎麼寫
實驗四
select t.fcity, t.fage, count(*) over看下執行效果:()from
person t
where t.fsalary <
5000
可以看到這個sql語句與我們第乙個實驗不同的是我們在count(*)後面加了乙個over關鍵字。
開窗函式的呼叫格式為:
函式名(列)over(選項)
over關鍵字表示把函式當成開窗函式而不是聚合函式,sql標準允許將所有聚合函式用做開窗函式,使用over關鍵字來區分這兩種用法。
在上面的例子中,開窗函式count(*) over()對於查詢結果的每一行都返回所有符合條件的行的條數,over關鍵字後的括號中還經常新增選項用以改變進行聚合運算的視窗範圍(後面部落格會持續更新),如果over關鍵字後的括號中選項為空,則開窗函式會對結果集中的所有行進行聚合運算。當然,不只是count(*) over,max(fage) over(),min(fage) over()都可以。
開窗函式簡介
比如我們想查詢每個工資小於5000元的員工資訊 城市以及年齡 並且在每行中都顯示所有工資小於5000元的員工個數,執行下面的sql語句 這個語句顯然是錯誤的,因為count 是聚合函式,然後fname和fage欄位沒有包含分組裡面。那麼,這樣寫呢?sql view plain copy select...
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開窗函式
mysql8.0之前的版本是不支援開窗函式的,8.0之後才支援。開窗函式與聚合函式的計算方式一樣,也是對行集組進行聚合計算,但是它不像普通聚合函式那樣每組只返回乙個值,開窗函式可以為每組返回多個值。假設有乙個員工資訊表worker,資料如下圖一。如果我們要計算所有人或者每個年齡的平均工資,可通過聚合...