PostgreSQL窗口函数
1、什么是窗口函数
窗口函数在和当前行相关的一组表行上执行计算。 这相当于一个可以由聚合函数完成的计算类型。但不同于常规的聚合函数, 使用的窗口函数不会导致行被分组到一个单一的输出行;行保留其独立的身份。 在后台,窗口函数能够访问的不止查询结果的当前行。
- 可以访问与当前记录相关的多行记录;
- 不会使多行聚集成一行, 与聚集函数的区别;
2、窗口函数语法
window_func() OVER(PARTITION BY [字段] ORDER BY [字段])
窗口函数跟随一个OVER
子句,OVER
子句决定究竟查询中的哪些行被分离出来由窗口函数处理。其中分区PARTITION BY
与排序ORDER BY
指令可以可选的,如果不指定,则等同于聚合函数,对全部数据进行计算。
3、窗口函数示例
数据的准备
--建表
CREATE TABLE empsalary(
empno serial NOT null,
depname varchar(30),
salary int
)
--插入数据
INSERT INTO empsalary(depname,salary)
values('develop',4200),
('develop',2700),
('develop',6700),
('develop',3700),
('develop',3700),
('personnel',4200),
('personnel',6500),
('personnel',5600),
('sales',7600),
('sales',4600),
('sales',1600);
- 统计每个部门的最高、最低、平均、汇总工资
SELECT e.*,avg(e.salary) over(PARTITION BY e.depname) FROM empsalary e;
SELECT e.*,max(e.salary) over(PARTITION BY e.depname) FROM empsalary e;
SELECT e.*,min(e.salary) over(PARTITION BY e.depname) FROM empsalary e;
SELECT e.*,sum(e.salary) over(PARTITION BY e.depname) FROM empsalary e;
将上面的语句加上排序,看下又会是什么效果
SELECT e.*,avg(e.salary) over(PARTITION BY e.depname ORDER BY e.salary) FROM empsalary e;
- 按照每个部门编号
SELECT e.*,RANK() over(PARTITION BY e.depname ORDER BY e.salary) FROM empsalary e;
通过上面的例子,可以看出使用窗口函数,来统计方便很多。如果不用窗口函数,我们就会使用group by
来做一堆的处理才能达到想要的效果。