认识窗口函数
在说窗口函数之前我们先来看一个问题:
假设我们有这样一张products表:
我们想要同时取出产品的名称、售价,同时列出这件产品对应的商品类型的平均价格?
按照以前我们的子查询知识我们可以这样:
select name,
price,
(select avg(price) from products where type = p.type) as type_avg_price
from products p;
很好!能够正确执行,但窗口函数有更好的办法(可以先分类再算平均价格)
select name,
price,
avg(price) over (partition by type) as type_avg_price
from products;
# partition by是按照什么分类的意思
这也能很好的执行。
下面让我们把问题难度加大,我们需要同时取出商品名称、价格、然后按照商品的价格在自己的品类中去排序。
如果用普通的方法比较不好做了,但窗口函数有办法
select name,
price,
row_number() over (partition by type order by price) as postition
from products;
# row_number是postgresql中的排序函数
# 这里先分类,再排序
窗口函数的语法
函数 OVER (<PARTITION BY column_name> <ORDER BY column_name>)
# 函数主要有两种:(sum avg min max)聚合函数、(rank、dense_rank、row_number)专用窗口函数
# partition by 和 order by 都是可以省略的
小结
- 窗口函数的关键点在于,它可以先分类再做函数操作;
- 对比于聚合函数,窗口函数具有聚合的同时保留其它列展示的功能,故称窗口。