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

news2024/11/26 16:37:06

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、求出每个商品的总数,并且求出每个商品的销售平均值

SELECT
	shopname,
	sale_date,
	sum( sales ),
	avg( sales ) 
FROM
	demo.chapter11 a 
GROUP BY
	a.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.coloradmin.cn/o/1342749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于YOLOv8的遥感SAR舰船小目标识别

💡💡💡本文摘要:基于YOLOv8的遥感SAR舰船小目标,阐述了整个数据制作和训练可视化过程 1.YOLOv8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的…

1.2.0 IGP高级特性之FRR

理论部分参考文档:Segment Routing TI-LFA FRR保护技术 - 华为 一、快速重路由技术 FRR(Fast Reroute)快速重路由 实现备份链路的快速切换,也可以与BFD联动实现对故障的快速感知。 随着网络的不断发展,VoIP和在线视频等业务对实时性的要求越…

堪比Postman!这款IDEA插件真好用!

Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:Apipost Helper,写完代码就可以调试接口并一键生成接口文档!而且还…

Arduino驱动VL6180X光学测距传感器(OLED显示)

Arduino驱动VL6180X光学测距传感器(OLED显示) 简介原理模块参数接线图代码结果 简介 VL6108X三合一光电模块,芯片内集成了IR VSEL(vertical-cavity surface-emitting laser)红外垂直腔面发射激光器光源、接近传感器、环境光传感器&#xff0…

《网络是怎样连接的》1.2、1.3、1.4节图表(自用)

图2.1:浏览器调用socket库中的解析器,向DNS服务器询问域名的ip地址 (图中的gethostbyname是解析器的名称;协议栈是操作系统的网络控制软件,也称协议驱动、TCP/IP驱动) 图2.2 DNS服务器根据客户端查询信息查…

解析Web自动化测试工具能做什么?

随着互联网的蓬勃发展,Web应用程序在我们生活和工作中扮演着愈发重要的角色。为确保这些Web应用程序的质量、稳定性和安全性,Web自动化测试工具应运而生。本文将介绍Web自动化测试工具的多重功能,以及它们如何在软件开发生命周期中发挥关键作…

分享一套超有价值的JAVA开源MES系统

商业开源的一套超有价值的JAVA制造执行MES系统源码 亲测 带本地部署搭建教程 教你如何在本地运行运行起来。 开发环境:jdk11tomcatmysql8springbootmaven 需要源码,私信我获取。 一、系统概述: MES制造执行系统,其定位于制造执…

OKCC语音机器人的人机耦合来啦

目前市场上语音机器人的外呼形式基本就分为三种,一种纯AI外呼,第二种也是目前主流的AI外呼转人工。那么第三种也可能是未来的一种趋势,人机耦合,或者也叫人机协同。 那么什么是人机耦合呢? 人机耦合是为真人坐席创造相…

springCould中的OpenFeign-从小白开始【6】

目录 1.简单介绍❤️❤️❤️ 2.能干嘛❤️❤️❤️ 3.简单入门 ❤️❤️❤️ 4.超时控制 ❤️❤️❤️ 5.日志打印❤️❤️❤️ 1.简单介绍❤️❤️❤️ OpenFeign是一个用于微服务架构中的声明式、模板化的HTTP客户端库。它简化了编写服务间通信的代码,使得开…

nrm的保姆级使用教程

📢 鸿蒙专栏:想学鸿蒙的,冲 📢 C语言专栏:想学C语言的,冲 📢 VUE专栏:想学VUE的,冲这里 📢 CSS专栏:想学CSS的,冲这里 &#x1f4…

Linux开发工具——gdb篇

Linux下调试工具——gdb 文章目录 makefile自动化构建工具 gdb背景 gdb的使用 常用命令 总结 前言: 编写代码我们使用vim,编译代码我们使用gcc/g,但是我们,不能保证代码没问题,所以调试是必不可少的。与gcc/vim一样&…

Oracle 拼接字符串

语法 使用||拼接如果内容中有单引号,则可在该单引号前面再加一个单引号进行转义 例子 比如有一个业务是根据需要生成多条插入语句 select insert into des_account_des_role(des_account_id, roles_id) values( || id || , || (select id from des_role where wo…

统一入口,全面提升工作效率,WorkPlus超级APP引领数字化办公新潮流

在数字化办公的时代,企业往往面临着多个应用管理的挑战。员工需要在众多应用之间切换,记忆不同的登录凭证,这不仅分散了注意力,还降低了工作效率。为了应对这一问题,企业需要一站式的解决方案,通过整合繁杂…

【Linux】chage命令使用

chage命令 chage用来更改linux用户密码到期信息,包括密码修改间隔最短、最长日期、密码失效时间等。 语法 chage [参数] 用户名 chage命令 -Linux手册页 选项及作用 执行令 : chage --help 执行命令结果 参数 -d, --lastday 最近日期 …

C++ Qt开发:SqlRelationalTable关联表组件

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍SqlRelationalTable关联表组件的常用方法及灵…

卖家速进!海外社媒矩阵玩起来,让你拥有海量曝光!

作为跨境人,我们都知道利用海外社交媒体去引流,像现在这么多拥有庞大流量的社媒平台,想获得更好的引流效果,那就离不开做社媒矩阵了,打造社交媒体矩阵可以为卖家建立更优流量池,今天龙哥就分享有关社媒矩阵…

Java智慧工地源码,Spring Cloud +UniApp +MySql技术开发,支持多端展示

智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合,为工程项目管理提供先进技术手段,构建工地现场智能监控和控制体系,弥补传统方法在监管中的缺陷,最线实现项目对人、机、料、法、环的全…

JavaScript之常用的事件

文章目录 前言为什么使用事件呢?常用的触发事件窗口事件onbluronfocusonresize窗口加载事件 表单事件onchangeoninput 键盘事件onkeydownonkeyup 鼠标事件onclickondblclickonmousemoveonmouseoutonscroll 总结窗口事件总结表单事件总结键盘事件总结鼠标事件总结 前言 在网页中…

京东年度数据报告-2023全年度烘干机十大热门品牌销量榜单

相较于洗衣机,烘干机市场虽然起步较晚,但在消费升级的浪潮中,烘干机的价值越来越被更多的家庭认可和信赖,行业整体也越来越成熟。不过,随着市场的趋向饱和,烘干机市场的增长也日趋乏力,2023年烘…

Redis:原理速成+项目实战——初识Redis、Redis的安装及启动、Redis客户端

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:首期文章 📚订阅专栏:Redis速成 希望文章对你们有所帮助 在此之前,我做过的项目里面也用到了…