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