認(rèn)識(shí)窗口函數(shù)
在說(shuō)窗口函數(shù)之前我們先來(lái)看一個(gè)問(wèn)題:
假設(shè)我們有這樣一張products表:

Snip20171230_1.png
我們想要同時(shí)取出產(chǎn)品的名稱、售價(jià),同時(shí)列出這件產(chǎn)品對(duì)應(yīng)的商品類型的平均價(jià)格?
按照以前我們的子查詢知識(shí)我們可以這樣:
select name,
price,
(select avg(price) from products where type = p.type) as type_avg_price
from products p;

Snip20171230_2.png
很好!能夠正確執(zhí)行,但窗口函數(shù)有更好的辦法(可以先分類再算平均價(jià)格)
select name,
price,
avg(price) over (partition by type) as type_avg_price
from products;
# partition by是按照什么分類的意思

Snip20171230_3.png
這也能很好的執(zhí)行。
下面讓我們把問(wèn)題難度加大,我們需要同時(shí)取出商品名稱、價(jià)格、然后按照商品的價(jià)格在自己的品類中去排序。
如果用普通的方法比較不好做了,但窗口函數(shù)有辦法
select name,
price,
row_number() over (partition by type order by price) as postition
from products;
# row_number是postgresql中的排序函數(shù)
# 這里先分類,再排序

Snip20171230_4.png
窗口函數(shù)的語(yǔ)法
函數(shù) OVER (<PARTITION BY column_name> <ORDER BY column_name>)
# 函數(shù)主要有兩種:(sum avg min max)聚合函數(shù)、(rank、dense_rank、row_number)專用窗口函數(shù)
# partition by 和 order by 都是可以省略的
小結(jié)
- 窗口函數(shù)的關(guān)鍵點(diǎn)在于,它可以先分類再做函數(shù)操作;
- 對(duì)比于聚合函數(shù),窗口函數(shù)具有聚合的同時(shí)保留其它列展示的功能,故稱窗口。