MySQL8.0聚合函数+over()函数

1、数据表内容为:
在这里插入图片描述

CREATE TABLE chapter11 (shopname VARCHAR(255) NULL,sales VARCHAR(255) NULL,sale_date VARCHAR(255) NULL
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_0900_ai_ci;INSERT INTO chapter11 (shopname, sales, sale_date) VALUES('A', '1', '2020/1/1');
INSERT INTO chapter11 (shopname, sales, sale_date) VALUES('B', '3', '2020/1/1');
INSERT INTO chapter11 (shopname, sales, sale_date) VALUES('C', '5', '2020/1/1');
INSERT INTO chapter11 (shopname, sales, sale_date) VALUES('A', '7', '2020/1/2');
INSERT INTO chapter11 (shopname, sales, sale_date) VALUES('B', '9', '2020/1/2');
INSERT INTO chapter11 (shopname, sales, sale_date) VALUES('C', '2', '2020/1/2');
INSERT INTO chapter11 (shopname, sales, sale_date) VALUES('A', '4', '2020/1/3');
INSERT INTO chapter11 (shopname, sales, sale_date) VALUES('B', '6', '2020/1/3');
INSERT INTO chapter11 (shopname, sales, sale_date) VALUES('C', '8', '2020/1/3');

1、求出总平均值:

-- 从demo.chapter11表中选择数据  
select  shopname,          -- 选取shopname字段  sales,              -- 选取sales字段  sale_date,          -- 选取sale_date字段  -- 使用子查询计算demo.chapter11表的平均销售额  (select avg(sales) from demo.chapter11) as avgsales,  -- 固定值'测试数据'作为test_col列  '测试数据' as test_col    
from  demo.chapter11;      -- 从demo.chapter11表中选择数据

由于sales加起来是45,除以这9列,所有平均值为为5!
在这里插入图片描述上面的代码虽然可以实现我们的需求,但是略显烦琐,我们可以使用窗口函数的 over0函数轻松实现上面的需求,只需要在聚合函数后面加一个 over函数即可具体实现代码如下:

over()函数

select  shopname,  sales,  sale_date,   -- 使用窗口函数计算每个记录的平均销售额  avg(sales) over() as avgsales  
from  demo.chapter11;

在这里插入图片描述

2、求出每个商品的总数,并且求出每个商品的销售平均值

SELECTshopname,sale_date,sum( sales ),avg( sales ) 
FROMdemo.chapter11 a 
GROUP BYa.shopname

在这里插入图片描述

3、求出每个商品的销售平均值

-- 从demo.chapter11表中选择shopname、sales和sale_date字段的值  
SELECT  a.shopname,              -- 选取demo.chapter11表中的shopname字段  a.sales,                  -- 选取demo.chapter11表中的sales字段  a.sale_date,               -- 选取demo.chapter11表中的sale_date字段  avg_table.avg_sales        -- 选取avg_table表中的avg_sales字段  
FROM  demo.chapter11 a            -- 从demo.chapter11表中选择数据,并给这个表起个别名为a  
LEFT JOIN                     -- 使用左连接将avg_table表连接到demo.chapter11表上  (SELECT                       -- 子查询开始  shopname,                     -- 选取shopname字段  avg(sales) AS avg_sales       -- 计算每个分组的平均销售额,并命名为avg_sales  FROM  demo.chapter11 b              -- 从demo.chapter11表中选择数据,并给这个表起个别名为b  GROUP BY                       -- 按shopname字段分组  b.shopname) avg_table         -- 将结果命名为avg_table表  
ON                             -- 连接条件是两表之间的shopname字段相等  a.shopname = avg_table.shopname;   -- 将a表的shopname字段与avg_table表的shopname字段进行匹配

在这里插入图片描述
上面的写法太过于麻烦:下面用partition by

partition by

partition by的作用与group by类似,在over0函数中使用partition by 来指明要按照哪列进行分组,然后聚合函数就会在分好的组内进行聚合运算,此处按照shopname列进行分组,具体实现代码如下:

以下是详细的中文注释:


-- 计算每个shopname分组的平均销售额  
SELECT  a.shopname,              -- 选取demo.chapter11表中的shopname字段  a.sales,                  -- 选取demo.chapter11表中的sales字段  a.sale_date,               -- 选取demo.chapter11表中的sale_date字段  avg(a.sales) over (partition by a.shopname) as avg_sales  -- 使用窗口函数计算每个shopname分组的平均销售额  
FROM  demo.chapter11 a ;           -- 从demo.chapter11表中选择数据,并给这个表起个别名为a这个SQL查询的目的是从demo.chapter11表中选取shopname、sales和sale_date字段的值,并使用窗口函数计算每个分组的平均销售额。
在这个查询中,使用了窗口函数avg(a.sales) over (partition by a.shopname)
来计算每个shopname分组的平均销售额。
窗口函数允许在查询结果的不同部分(窗口)上执行聚合操作,
而不需要对整个结果集进行分组。在这个例子中,窗口函数根据shopname字段对数据进行分区,
并计算每个分组的平均销售额。结果将命名为avg_sales。

4、每个店铺每天的销量与该店铺自己所有销量的平均值之间的比较

order by

SELECT  a.shopname,              -- 选取demo.chapter11表中的shopname字段  a.sales,                  -- 选取demo.chapter11表中的sales字段  a.sale_date,               -- 选取demo.chapter11表中的sale_date字段  avg(a.sales) over (partition by a.shopname ORDER BY a.sale_date) as avg_sales  -- 使用窗口函数计算每个shopname分组的平均销售额  
FROM  demo.chapter11 a ;店铺A在202011日的平均值就是它本身,
在12日的平均值是11日与12日两天的平均值,
在13日的平均值是11日、12日、13日二天的平均值。
前面讲的over()、partition byorder by 
使用的聚合函数都是求平均值运算,当然也可以使用其他聚合函数,

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/295594.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式(三)-结构型模式(6)-享元模式

一、为何需要享元模式(Flyweight)? 假如在网页中渲染这样的一个画面:大小不一的星星铺满了整个画布,并且都在不断的进行移动闪烁着。一批星星消失了,另一批又从另一边缘处出现。 要实现这样的渲染效果,在…

【大数据HA】HAProxy实现thrift协议HMS服务的高可用-附Chatgpt协助截图

背景 之前安装了HMS(Hive metastore service),独立于hive运行,安装部署过程见我下面列出的另一篇文章,需要为它建立HA高可用功能。防止在访问时出现单点故障问题。 【大数据】Docker部署HMS(Hive Metastore Service)并使用Trino访问Minio-C…

VS Code实现“Ctr+save”保存代码自动格式化

一、下载Prettier - Code formatter插件 点击安装即可 二、配置 【1】打开文件——首选项——设置 或者左下角齿轮打开设置 【2】搜索设置框输入editor default formatter(意思是默认格式化设置),接着下拉选中刚下好的插件名称Prettier - C…

C++初级学习六——数组

一维数组 定义: 1、数组是把具有相同类型的若干变量按有序的形式组织起来的集合。 2、数组是一组用来存放多个相同类型的数据集合,该集合中的每一个成员称为数组元素。 3、通过数组名和一个下标唯一确定的称…

ChatGPT的GPTs是什么?

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 ​ 在 OpenAI 的DevDay(11 月 6日),该公司宣布推出 ChatGPT GPT:任何人都可以制作并与他人共享的 ChatGPT 自定义版…

线程池构造方法的认识

线程池中构造方法的认识 文章目录 线程池中构造方法的认识corePoolSize (核心线程数)maximumPoolSize(最大线程数)keepAliveTime(非核心线程的空闲超时时间)TimeUnitworkQueuethreadFactoryRejectedExecutionHandler拒绝策略 标准库中提供了一个ThreadPo…

智能优化算法应用:基于北方苍鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于北方苍鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于北方苍鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.北方苍鹰算法4.实验参数设定5.算法结果6.…

matlab实践(十一):导弹追踪

1.题目 a9.94,x062.06 2.方程 我们有: ( d x d t ) 2 ( d y d t ) 2 w 2 (\frac{\mathrm d\mathrm x}{\mathrm d\mathrm t})^2(\frac{\mathrm d\mathrm y}{\mathrm d\mathrm t})^2\mathrm w^2 (dtdx​)2(dtdy​)2w2 还有导弹始终指向船 ( d x d t d y d t ) …

mingw下编译opencv4.5.2

初衷: 加载之前的模型没问题,但最近加载另一个模型时出现报错: OpenCV: terminate handler is called! The last OpenCV error is: OpenCV(4.1.0) Error: Assertion failed (nodesMapIt ! nodesMap.end()) in sortByExecutionOrder, file G…

Vue和jQuery:横向对比

聚沙成塔每天进步一点点 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏!创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习。每篇文章都致力于提供清晰、深入的参考资料,让你能够更轻松、更自信地理解和掌握 Vue.js 的核心概念和技…

java并发编程三 共享内存的问题和synchronized解决方案

文章目录 共享带来的问题synchronized 解决方案方法上的 synchronized 共享带来的问题 小故事 老王(操作系统)有一个功能强大的算盘(CPU),现在想把它租出去,赚一点外快 小南、小女(线程&…

数字人解决方案——ER-NeRF实时对话数字人模型推理部署带UI交互界面

简介 这个是一个使用ER-NeRF来实现实时对话数字人、口播数字人的整体架构,其中包括了大语言回答模型、语音合成、成生视频流、背景替换等功能,项目对显存的要求很高,想要达到实时推理的效果,建议显存在24G以上。 实时对话数字人 …