PostgreSQL窗口函数

窗口函数在SQL中用于在一组相关行上执行计算,保持行的独立性,常用于数据分析。它们允许访问当前行及其相邻行,提供聚合功能而不会丢失行信息。本文介绍了窗口函数的基本概念、语法,并通过示例展示了如何使用AVG、MAX、MIN和SUM等函数统计每个部门的工资统计信息。此外,还展示了如何结合RANK函数按工资排序,揭示了窗口函数在简化复杂查询中的优势。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小老虎Love

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值