Postgresql窗口函數(shù)(一)

聚合函數(shù)大家都用過,像sum,min,avg等,一般是和group by配合使用。和聚合函數(shù)類似,窗口函數(shù)也是計(jì)算一些行集合(多個(gè)行組成的集合,我們稱之為窗口window frame)的數(shù)據(jù)。但和常規(guī)的聚集函數(shù)不同的是,窗口函數(shù)不會(huì)將參與計(jì)算的行合并成一行輸出,而是將計(jì)算出來的結(jié)果帶回到了計(jì)算行上。

比如我們要想將員工的工資和該部門的平均工資進(jìn)行比較。傳統(tǒng)的作法是先通過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ù)可以簡化很多

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兩部分,分別用來分組和確定組內(nèi)輸出順序,PARTITION BY和ORDER BY都是可選的。

如果兩個(gè)都省略的,整個(gè)表會(huì)被作為一個(gè)分組,查詢出來的是所有員工的平均工資,這個(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è)部門的平均工資。這樣的話第三組是所有員工的平均工資就說的通了,也就是“develop”、“personnel”和“sales”三個(gè)部門的平均工資。小伙伴們使用的時(shí)候要特別注意呀。

如果一個(gè)查詢中包含多個(gè)窗口函數(shù),那么我們可以寫多個(gè)OVER子句。但如果這些窗口函數(shù)的作用是一樣的,那分開寫多個(gè)很煩人,也容易出錯(cuò)。這種情況下,我們可以將窗口里面的內(nèi)容寫成一個(gè)WINDOW子句,然后在多個(gè)OVER子句中引用。比如我們列一下部門的平均工資和最高工資:

使用windows字句,可以是這樣:


最后說一句:

所有的聚合函數(shù)都可以作為窗口函數(shù)使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.簡介 數(shù)據(jù)存儲(chǔ)有哪些方式?電子表格,紙質(zhì)文件,數(shù)據(jù)庫。 那么究竟什么是關(guān)系型數(shù)據(jù)庫? 目前對(duì)數(shù)據(jù)庫的分類主要是...
    喬震閱讀 2,004評(píng)論 0 2
  • 高級(jí)函數(shù)_分析函數(shù)與窗口函數(shù) 分析函數(shù)往往與窗口函數(shù)一起使用,over()為窗口函數(shù) 一、分析函數(shù) 1.01、排名...
    lingoling閱讀 1,224評(píng)論 0 2
  • 查詢是數(shù)據(jù)的一個(gè)重要操作。用戶發(fā)送查詢請求,經(jīng)編譯軟件變異成二進(jìn)制文件供服務(wù)器查詢,后返回查詢結(jié)果集給用戶,查詢會(huì)...
    產(chǎn)品小正閱讀 1,533評(píng)論 0 2
  • mysql數(shù)據(jù)庫中 :database : 文件夾table : 數(shù)據(jù)表(數(shù)據(jù)文件) 進(jìn)入mysqlmysql -...
    賦閑閱讀 637評(píng)論 0 0
  • 學(xué)習(xí)步驟: 1. 擁有Oracle EBS demo 環(huán)境 或者 PROD 環(huán)境 2. copy以下代碼進(jìn) PL/...
    牛馬風(fēng)情閱讀 339評(píng)論 0 1

友情鏈接更多精彩內(nèi)容