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来做一堆的处理才能达到想要的效果。

posted @ 2021-05-22 17:03  懵懂小虎  阅读(408)  评论(0编辑  收藏  举报