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