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

很好!能够正确执行,但窗口函数有更好的办法(可以先分类再算平均价格)

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

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

这也能很好的执行。

下面让我们把问题难度加大,我们需要同时取出商品名称、价格、然后按照商品的价格在自己的品类中去排序。
如果用普通的方法比较不好做了,但窗口函数有办法

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 都是可以省略的

小结

  • 窗口函数的关键点在于,它可以先分类再做函数操作;
  • 对比于聚合函数,窗口函数具有聚合的同时保留其它列展示的功能,故称窗口。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,791评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,737评论 19 139
  • 2017年4月23日 晴 我今天去图书馆啦,我看了一本漫画书,里面有八路军,他们正在攻击日本兵,日本用大炮和飞机...
    不系之舟a阅读 2,578评论 0 4
  • 记忆 或模糊或清晰 记忆总会淡忘,总要留下印记,至少证明我曾来过 我是搞*** IT的,对于一个 挨踢狗 来讲,...
    Lux_Yan阅读 2,454评论 3 0