MySQL开窗聚合函数——SUM(),AVG(),MIN(),MAX()

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL开窗聚合函数——SUM(),AVG(),MIN(),MAX()

在窗口中每条记录动态地应用聚合函数(SUM()、AVG()、MAX()、MIN()、COUNT()),可以动态计算在指定的窗口内的各种聚合函数值。


有的小伙伴可能会有所疑问,这和传统的聚合函数到底有什么区别呢?


其实最大的区别在于,一个操作列,一个是依次操作行,最终显示出每一行,最后的效果就是呈现叠加的效果,举一个简单的例子:


假如,小王每个月的薪水是不定的,第一个月是10000,第二个月是15000,第三个月是20000,第四个月是22000……,那么如果是sum()最终出现的结果就是叠加每个月的数值;但是如果使用sum() over(partition by XXX order by desc)


这里依然使用上一篇的文章的数据集

select  
 dname,
 ename,
 salary,
 sum(salary) over(partition by dname order by hiredate) as pv1 
from employee;

image.png


根据上面的结果,可以明显的看出,sum()操作是对每一行进行迭代,迭代之前的总数,那么有的人就会疑问这个有什么用呢?


假设,你是公司的财务负责人,现在你需要统计一下每个部门的每月薪水消费是多少,那么每一次进入新的员工,就会加入新的员工薪水,这个时候我们可以按照每个月进行统计,统计各个部门的薪水需求是多少,一目了然的统计表格,会让老板给你升职加薪的!


如果没有order by 操作就会对所有的数据进行聚合操作


select  
 dname,
 ename,
 salary,
 sum(salary) over(partition by dname ) as '总数'
from employee;
-- 如果没有order  by排序语句  默认把分组内的所有数据进行sum操作


image.png

那么这样的操作可以做些什么,有时候我们可以这样的数据计算,该员工的薪水占比该部门的比率是多少,当我们灵活运用这种函数的时候,我们就会发现可以挖掘出很多的有效的信息。


当然我们也可以控制行数,开头和结尾


rows between unbounded(开头) preceding  and current(当前行) row


默认就是这样


select  
 dname,
 ename,
 salary,
 sum(salary) over(partition by dname order by hiredate  rows between 3 preceding and current row) as c1 
from employee;

image.png


从当前行向上取出三个值,相加然后和当前行相加,就得到了当前行的最终值,如果是没有的话,那么就取到有的值。


select  
 dname,
 ename,
 salary,
 sum(salary) over(partition by dname order by hiredate  rows between 3 preceding and 1 following) as c1 
from employee;

image.png


这里就是取出前面三行和后面一行,再去和本身相加,最终得到最终值

select  
 dname,
 ename,
 salary,
 sum(salary) over(partition by dname order by hiredate  rows between current row and unbounded following) as c1 
from employee;


image.png

从当前行加到最后


当然,学会了这个语法结构和本质的原理之后,我们可以将sum换成avg或者max等聚合函数,最终的原理都是一样的。


俗话说:“学而不思则罔,思而不学则殆”,学习之后也需要自己去总结,不能盲目的学习,最终什么也没有收获到,这样的学习是低效率的学习。


语法结构需要熟记:rows between unbounded(开头) preceding  and current(当前行) row


而且这一行代码是紧跟到order by 后面的,也就是说,按照这样的形式我们可以最终获取


rows是不需要变动的参数,between 也是不需要变动的参数


unbounded preceding :开头


number preceding :加上具体的数字就是往上取到多少值


注意:如果是数值的话,或者开头一定要跟上preceding这个参数


current row:表示当前行,如果出现这个那么也就是范围指定到后面了


其次不变的就是and


如果and后面跟上具体的数字,那么就是代表着向后取多少行


unbounded following:取到最后一行


number following:向后取到具体的行


注意:如果是数值和unbounded就需要注意加following


current row:表示当前行,如果出现这个那么也就是范围指定到后面了,注意row不要忘记了


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
SQL 关系型数据库 MySQL
mysql子查询、聚合函数
mysql子查询、聚合函数
|
6月前
|
关系型数据库 MySQL 数据挖掘
轻松入门MySQL:深入理解MySQL聚合函数,实战进销存项目中的应用与技巧(8)
轻松入门MySQL:深入理解MySQL聚合函数,实战进销存项目中的应用与技巧(8)
|
6月前
|
关系型数据库 MySQL 数据库
MySQL查询聚合函数与分组查询
MySQL查询聚合函数与分组查询
|
2月前
|
SQL 关系型数据库 MySQL
MySQL:表的设计原则和聚合函数
本文详细介绍了数据库表设计的原则与范式,包括从需求中找到实体及其属性,确定实体间关系,并使用SQL创建具体表。文章还深入探讨了一范式、二范式和三范式的要求及不满足这些范式时可能遇到的问题。此外,文中通过实例解释了一对一、一对多和多对多关系的表设计方法,并介绍了如何使用聚合函数如 COUNT()、SUM()、AVG()、MAX() 和 MIN() 进行数据统计和分析。最后,文章还展示了如何通过 SQL 语句实现数据的复制和插入操作。
53 7
MySQL:表的设计原则和聚合函数
|
1月前
|
存储 关系型数据库 MySQL
深度剖析:MySQL聚合函数 count(expr) 如何工作?如何选择?
本文详细探讨了MySQL中count(expr)函数的不同形式及其执行效率,包括count(*)、count(1)、count(主键)、count(非主键)等。通过对InnoDB和MyISAM引擎的对比分析,解释了它们在不同场景下的实现原理及性能差异。文章还通过实例演示了事务隔离级别对统计结果的影响,并提供了源码分析和总结建议。适合希望深入了解MySQL统计函数的开发者阅读。
54 0
|
6月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路 | 基础篇】MySQL之聚合函数与应用
【MySQL进阶之路 | 基础篇】MySQL之聚合函数与应用
【MySQL进阶之路 | 基础篇】MySQL之聚合函数与应用
|
4月前
|
关系型数据库 MySQL 数据挖掘
MySQL 聚合函数案例解析:深入实践与应用
MySQL 聚合函数案例解析:深入实践与应用
|
4月前
|
SQL 关系型数据库 MySQL
MySQL 聚合函数深入讲解与实战演练
MySQL 聚合函数深入讲解与实战演练
|
5月前
|
关系型数据库 MySQL Windows
14. Mysql 开窗函数,一文带你直接通关
14. Mysql 开窗函数,一文带你直接通关
516 0
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
57 0