摘要:和聚合函數類似,窗口函數也是計算一些行集合多個行組成的集合,我們稱之為窗口的數據。但如果這些窗口函數的作用是一樣的,那分開寫多個很煩人,也容易出錯。
聚合函數大家都用過,像sum,min,avg等,一般是和group by配合使用。和聚合函數類似,窗口函數也是計算一些行集合(多個行組成的集合,我們稱之為窗口window frame)的數據。但和常規的聚集函數不同的是,窗口函數不會將參與計算的行合并成一行輸出,而是將計算出來的結果帶回到了計算行上。
比如我們要想將員工的工資和該部門的平均工資進行比較。傳統的作法是先通過group by 統計出部門平均工資,再用員工表左連一下上面的統計結果。
with dep_avg_salary as ( select dept_name as dept_name, avg(salary) as dep_avg_salary from emp_salary group by dept_name ) select e.dept_name, e.emp_no, e.salary, das.dep_avg_salary from emp_salary e left join dep_avg_salary das on das.dept_name = e.dept_name order by e.dept_name
使用窗口函數可以簡化很多
SELECT dept_name, emp_no, salary, avg(salary) OVER (PARTITION BY dept_name) as dep_avg_salary FROM emp_salary;
我們看到這里列出的還是員工的數據,只是加上了根據depname分組統計的平均工資。
特別注意:
窗口函數只能在SELECT和ORDER BY子句中使用,不能在任何其他地方使用,比如GROUP BY、HAVING和WHERE子句
窗口函數必須和over字句配合使用。over子句包含PARTITION BY和ORDER BY兩部分,分別用來分組和確定組內輸出順序,PARTITION BY和ORDER BY都是可選的。
如果兩個都省略的,整個表會被作為一個分組,查詢出來的是所有員工的平均工資,這個還好理解。
如果省略PARTITION BY,而包含ORDER BY呢?
這個結果是不是很詭異?
對比之前的查詢結果,第一組”develop”的avg_salary(5660)是“develop”部門的平均工資,第三組“sales”的值(5218.18)是所有員工的平均工資,那第二組“personnel”的值(5114.28)是什么呢?怎么產生的呢?
啊,盡然是“develop”和“personnel”兩個部門的平均工資。這樣的話第三組是所有員工的平均工資就說的通了,它是“develop”、“personnel”和“sales”三個部門的平均工資。小伙伴們使用的時候要特別注意呀。
如果一個查詢中包含多個窗口函數,那么我們可以寫多個OVER子句。但如果這些窗口函數的作用是一樣的,那分開寫多個很煩人,也容易出錯。這種情況下,我們可以將窗口里面的內容寫成一個WINDOW子句,然后在多個OVER子句中引用。比如我們列一下部門的平均工資和最高工資:
使用windows字句,可以是這樣:
最后說一句:
所有的聚合函數都可以作為窗口函數使用
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38969.html
摘要:和聚合函數類似,窗口函數也是計算一些行集合多個行組成的集合,我們稱之為窗口的數據。但如果這些窗口函數的作用是一樣的,那分開寫多個很煩人,也容易出錯。 聚合函數大家都用過,像sum,min,avg等,一般是和group by配合使用。和聚合函數類似,窗口函數也是計算一些行集合(多個行組成的集合,我們稱之為窗口window frame)的數據。但和常規的聚集函數不同的是,窗口函數不會將參與...
摘要:在上一篇里,主要窗口函數的基本用法。在這一篇中,我們來看看除了聚合函數之外還支持哪些窗口函數吧。注意到雖然為和的員工,相同,但返回的行號仍然連續。返回分組后的行號,但和和函數都不同,當對比值重復時行號重復但不間斷。 在上一篇里,主要窗口函數的基本用法。 在這一篇中,我們來看看postgresql除了聚合函數之外還支持哪些窗口函數吧。 row_number() 返回分組后的行號。注意到雖...
摘要:在上一篇里,主要窗口函數的基本用法。在這一篇中,我們來看看除了聚合函數之外還支持哪些窗口函數吧。注意到雖然為和的員工,相同,但返回的行號仍然連續。返回分組后的行號,但和和函數都不同,當對比值重復時行號重復但不間斷。 在上一篇里,主要窗口函數的基本用法。 在這一篇中,我們來看看postgresql除了聚合函數之外還支持哪些窗口函數吧。 row_number() 返回分組后的行號。注意到雖...
閱讀 3316·2021-11-25 09:43
閱讀 1304·2021-11-23 09:51
閱讀 3609·2021-10-11 11:06
閱讀 3698·2021-08-31 09:41
閱讀 3597·2019-08-30 15:53
閱讀 3510·2019-08-30 15:53
閱讀 965·2019-08-30 15:43
閱讀 3307·2019-08-29 14:02