postgreql 窗口函數用法

認識窗口函數

在說窗口函數之前我們先來看一個問題:
假設我們有這樣一張products表:


Snip20171230_1.png

我們想要同時取出產品的名稱、售價,同時列出這件產品對應的商品類型的平均價格?
按照以前我們的子查詢知識我們可以這樣:

select name,
       price,
       (select avg(price) from products where type = p.type) as type_avg_price
from products p;
Snip20171230_2.png

很好!能夠正確執(zhí)行,但窗口函數有更好的辦法(可以先分類再算平均價格)

select name,
       price,
       avg(price) over (partition by type) as type_avg_price
from products;

# partition by是按照什么分類的意思
Snip20171230_3.png

這也能很好的執(zhí)行。

下面讓我們把問題難度加大,我們需要同時取出商品名稱、價格、然后按照商品的價格在自己的品類中去排序。
如果用普通的方法比較不好做了,但窗口函數有辦法

select name,
       price,
       row_number() over (partition by type order by price) as postition
from products;

# row_number是postgresql中的排序函數
# 這里先分類,再排序
Snip20171230_4.png

窗口函數的語法

函數  OVER (<PARTITION BY column_name> <ORDER BY column_name>)

# 函數主要有兩種:(sum avg min max)聚合函數、(rank、dense_rank、row_number)專用窗口函數
# partition by 和 order by 都是可以省略的

小結

  • 窗口函數的關鍵點在于,它可以先分類再做函數操作;
  • 對比于聚合函數,窗口函數具有聚合的同時保留其它列展示的功能,故稱窗口。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,593評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • 2017年4月23日 晴 我今天去圖書館啦,我看了一本漫畫書,里面有八路軍,他們正在攻擊日本兵,日本用大炮和飛機...
    不系之舟a閱讀 325評論 0 4
  • 記憶 或模糊或清晰 記憶總會淡忘,總要留下印記,至少證明我曾來過 我是搞*** IT的,對于一個 挨踢狗 來講,...
    Lux_Yan閱讀 321評論 3 0