MySQL-开窗函数

背景

今天来讲讲MySQL8的新特性开窗函数,特别高大上的词哈,其实开窗函数就是对某块具有特性的记录集合执行的特殊统计函数。怎么听着这么熟悉,这不就是聚合函数么,没错,开窗函数的本质功能和聚合函数是一致的,只不过开窗函数更强大更具灵活性,具体语法如下。

开窗函数名([<字段名>]) over ([partition by <分组字段>] [order by <排序字段> [desc|asc]]) 

[]表示这块数据是可有可无的
<xxx>xxx是对这块数据的说明

  • partition by :按照指定 分组字段 对数据进行分区,开窗函数在不同的分区中 分别 执行
  • order by:按照指定字段排序,也是在不同分区内执行

看起来还是有点复杂的,但其实用起来还是很简单的,下面以员工表为案例带大家初探门径,员工表数据如下。
在这里插入图片描述

分部门统计员工的平均工资

不对啊,这个需求我好像使用聚合函数就可以实现啊

SELECT dname,avg(salary) FROM `employee` GROUP BY dname

在这里插入图片描述
没错用聚合函数也可以实现,相同功能用开窗函数的语法是这样的

SELECT dname,avg(salary) over (partition by dname) FROM `employee`

在这里插入图片描述
可以看到两者的结果之间有一个区别,就是开窗函数返回了很多条数据,而普通的聚合函数只返回了四行数据,欲知为何,先将开窗函数改成以下指令

SELECT *,avg(salary) over (partition by dname) FROM `employee`

执行结果如下所示
在这里插入图片描述
可以看到员工表中所有的数据都查询了出来,这就是两者之间的区别

  • avg是对数据分组后将一组的数据聚合平均
  • 开窗函数的avg是先对数据分组,然后对分组的每一条数据进行聚合平均,然后将结果放到每一条记录中

按入职时间降序分部门统计员工的工资累加值

SQL如下

select *,sum(salary) over (partition by dname order by hiredate desc) from employee

执行结果如下
在这里插入图片描述
如果把排序条件去掉就是分部门统计员工的工资总和
在这里插入图片描述

分部门统计以入职时间升序得到与前后两位同事的平均工资

乖乖,这需求都得想一想才绕的明白,下面直接看SQL

select *,avg(salary) over (partition by dname order by hiredate asc rows between 1 preceding and 1 following) from employee

rows between a preceding and b following的意思就是当前行的前a行和当前行的后b行

SQL的执行结果如下
在这里插入图片描述

按工资降序分部门统计员工信息,显示行号

SQL如下

select *,row_number() over (partition by dname order by salary) from employee

在这里插入图片描述

按入职时间升序分部门统计员工与下一个入职的员工的薪资差

SQL如下

SELECT *,( currSalary - nextSalary ) diff
FROM
	(
	SELECT
		*,
		salary currSalary,
		last_value( salary ) over ( PARTITION BY dname ORDER BY hiredate rows BETWEEN 0 preceding AND 1 following ) nextSalary 
	FROM
	employee 
	) r;

执行结果如下
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL中的开窗函数是一种强大的功能,可以根据指定的条件对查询结果进行分组、排序和聚合操作。开窗函数可以用于计算每个分组内的聚合值,并且可以在查询结果中返回每个行的详细信息。这使得开窗函数在处理复杂的分析和报表查询时非常有用。 在MySQL中,开窗函数的语法遵循标准的SQL语法。您可以在MySQL 8.0的官方文档中找到有关开窗函数的详细信息和示例用法。 开窗函数可以根据其功能进行分类。常见的开窗函数包括聚合开窗函数、排序开窗函数和其他类型的开窗函数。聚合开窗函数用于计算聚合值,比如求和、平均值等。排序开窗函数用于根据指定的条件对结果集进行排序。其他类型的开窗函数可以根据具体需求进行自定义的操作。 一个常见的示例是使用SUM函数作为聚合开窗函数,对每个分组内的特定列进行求和。例如,在一个名为"linux"的表中,我们可以使用SUM函数计算每个name分组内的cnt列的总和,并使用开窗函数在查询结果中返回每一行的详细信息。 我希望这个回答能帮助到您理解MySQL中的开窗函数。如果您需要更多信息,请参考MySQL 8.0的官方文档。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [MySQL开窗函数](https://blog.csdn.net/mr__sun__/article/details/124257213)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [mysql开窗函数](https://blog.csdn.net/m0_46926492/article/details/124236167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

芝麻\n

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

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

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

打赏作者

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

抵扣说明:

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

余额充值