MySQL如何按周统计表中数据

日产YD涡轮柴油发动机在MATLAB中的测试台分析:29个记录通道的性能、效率及完整能量平衡.zip 1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 立即下载

微信搜索“coder-home”或扫一扫下面的二维码,关注公众号,第一时间了解更多干货分享,还有各类视频教程资源。扫描它,带走我


背景

今天算法的同事过来问我MySQL中是否可以根据周的维度去统计某个指标?比如按周统计订单的数量。因为数据量比较大,如果直接全部查询到内存中去统计可能比较慢。所以他系统能够在SQL层面先做一次聚合统计,维度是按照周去统计。

刚听到这个需求,我有点蒙。按照周的方式去统计?MySQL中估计没有这样的by week的函数。有按照天统计简单,按照月统计也简单,我们只要把日期截取一下转为YYYY-MM的字符串然后再分组聚合就可以了。但是他要按照周来统计,确实有点难度。

但是MySQL这么成熟的数据库软件了,也不能说实现不了吧。说干就干,开整。

环境准备

准备建表语句

使用中使用到的表结构如和建表语句如下:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_no` varchar(32) DEFAULT NULL,
  `create_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

初始化数据语句

测试使用到的初始化数据使用如下的SQL进行初始化:

/*如下SQL执行多次即可产生多条测试数据*/
insert into test(order_no, create_timestamp) value(substr(rand(),3,18) ,date_add(date_add(date_add(date_add(now(), interval floor(1+rand()*23) hour), interval floor(1+rand()*60) minute), interval floor(1+rand()*60) second), interval -floor(1+rand()*40) day));

select * from test;

最后的实验环境

我们的实验环境如下所示,要求按周统计出订单的数目。
在这里插入图片描述

思路分析

MySQL中没有自带的把一个日期给转换为周的函数。不过,我们可以采用曲线救国的方式来实现。虽然它没有直接的函数,但是它自带的日期类型的函数还是很多的。

思路:我们的目的是把每一个订单创建时间这个字段的值,设置为一个可以使用的group by的key。这个key要求是根据同一个周的订单使用同一个时间。所以,我们需要想办法把属于同一个周的订单的创建时间转换为一个相同的日期,比如把所有属于同一个周的所有订单的创建时间,都转换为每周的周一这个时间。这样就可以根据周去聚合统计订单的数目了。

在把所有订单的创建时间转换为这个订单所属的周的周一时,就要知道这个订单的创建时间,距离这个周的一查几天,这样在这个订单的创建时间这个值上减去这个天数,就可以得到周一这个时间。

MySQL中有一个函数叫做weekday(x),其中x就是传入的一个日期类型的数据,传入后,返回这个日期是属于一周当中的第几天。是一个整形的数据,值的范围是[0,6],两个边界值分别代表每周的周一和周日。

一周有七天,当我们传入一个周一的日期给weekday(x)函数的时候,它会返回一个整形的数字0;当我们传入一个周日的日期的时候,它会返回一个整形的数字6。示例如下:
在这里插入图片描述

基于上面的函数weekday(x),我们可以得到每一个订单创建的时间属于一周当中的第几天。SQL语句如下所示:

select 
	*,
	weekday(create_timestamp) as weekday
from test limit 10;

实验结果如下所示:
在这里插入图片描述

然后我们在基于这个得到的整形的周几,用日期相加函数data_add()把每一个订单创建时间改为每一周的周一。使用如下的SQL语句来实现:

select 
	*,
	weekday(create_timestamp) as weekday,
	date_add(create_timestamp, interval - (weekday(create_timestamp)) day) as monday
from test limit 10;

结果截图如下:
在这里插入图片描述

此时我们已经得到每个订单创建时间所对应的周一这个日期,但是在monday这一列中还有时分秒,这将会影响我们进行聚合的时候作为key来使用这个字段,所以,我们需要把时分秒去掉只保留年月日即可,采用date_format(x,'%Y-%m-%d')函数就可以对这个日期进行格式化成我们希望要的格式。SQL语句如下:

select 
	*,
	weekday(create_timestamp) as weekday,
	date_format(date_add(create_timestamp, interval - (weekday(create_timestamp) + 1) day),'%Y-%m-%d') as monday
from test limit 10;

结果如下图所示:
在这里插入图片描述

最后,我们就可以使用聚合函数进行统计每周的订单数了,SQL语句如下:

select monday, count(1) from (
	select 
		*,
		weekday(create_timestamp) as weekday,
		date_format(date_add(create_timestamp, interval - (weekday(create_timestamp) + 1) day),'%Y-%m-%d') as monday
	from test
) as x 
group by monday 
order by monday;

最后的统计结果如下图所示,这就是我们希望要的结果了。
在这里插入图片描述

总结

最后梳理一下思路:根据每一行的创建时间计算出这个时间属于对应周第几天,然后用这个创建时间再减去这个的得到的第几天,就可以把每一个创建时间转换为每周的周一。这样就可以把所有属于同一个周的订单的创建时间,转换为了每一个周的周一。最后基于这个每周的周一就可以统计得到最后的每周的订单数目。

在MySQL中,按周的统计虽然不能直接实现,但是我们可以根据它现有个各种日期类型的函数,稍微转换变通一下,就可以实现我们平时的需求。所以,在遇到类似的这样的需求的时候,不要着急,按部就班分析一下,就可以基于现有的函数慢慢的一步步实现最后希望达到的效果。

这个解题的思路不仅仅可以适用于MySQL数据库,向Oracle数据库、SQLserver数据库、postgresql数据库都可以根据这个思路来实现按周去统计数据。


微信搜索“coder-home”或扫一扫下面的二维码,关注公众号,第一时间了解更多干货分享,还有各类视频教程资源。扫描它,带走我


MATLAB 风力涡轮机-发电机动力学模拟,具备比例速度控制.zip 1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 立即下载

相关推荐

科技中介服务机构在提供成果转化服务时,如何确保服务的专业性与可操作性?.docx

科技中介服务机构在提供成果转化服务时,如何确保服务的专业性与可操作性?

STM32Cube-AI-Studio-1.4.0

Windows STM32Cube-AI-Studio-1.4.0版本

“学海拾珠”系列之二百三十九:基于相关性最小生成树边缘节点的分层风险平价策略.pdf

“学海拾珠”系列之二百三十九:基于相关性最小生成树边缘节点的分层风险平价策略.pdf

直流微电网改进下垂控制+二次控制关联参数SOC混合储能(Simulink仿真实现)

内容概要:本文聚焦于直流微电网中的改进下垂控制与二次控制策略,重点提出一种关联储能单元荷电状态(SOC)的混合储能协调控制方法,并基于Simulink平台构建了完整的系统仿真模型。针对传统下垂控制存在的直流母线电压偏差及储能单元间SOC不均衡问题,该方案引入二次电压补偿控制以恢复母线电压,同时设计了一种基于SOC反馈的自适应下垂系数调节机制,使蓄电池、超级电容等不同类型储能装置能够依据其实时剩余容量动态分配功率,从而有效提升系统稳定性、延长储能寿命并增强能量利用效率。研究涵盖了光伏、风电、储能等多种分布式电源接入的直流微电网架构,通过仿真实验验证了所提控制策略在动态响应性能、功率分配合理性及SOC均衡能力方面的优越性。; 适合人群:电力系统、新能源发电、微电网运行与控制等领域的研究生、科研人员及工程技术人员,要求具备自动控制理论基础和MATLAB/Simulink仿真应用能力。; 使用场景及目标:①用于直流微电网中多源协同控制策略的教学演示与科研分析;②为解决储能系统SOC失衡与电压偏移问题提供可复现、可扩展的仿真方案;③支撑相关学术论文撰写、科研项目开发及先进控制算法的验证与优化。; 阅读建议:建议结合提供的Simulink模型与说明文档进行同步学习,重点关注SOC反馈机制与双层控制(下垂+二次控制)架构的设计逻辑,可通过调整负载工况与初始SOC参数开展对比仿真,深入理解控制策略的动态特性与鲁棒性表现。

一键合成阵列天线有源方向图(含matlab代码)

通过实测获取各单元的有源方向图,并据此合成阵列在不同扫描角下的总方向图,可以在不具备功分网络和移相器等波束控制硬件的场景下,完成相控阵多扫描角方向图的测试与验证,有效降低了测试系统的复杂度和成本。

产业园区如何实现创新资源的精准匹配与高效配置?.docx

产业园区如何实现创新资源的精准匹配与高效配置?

产业园区如何提升企业研发需求与高校科研成果的精准匹配?.docx

产业园区如何提升企业研发需求与高校科研成果的精准匹配?

国央企创新负责人如何实现技术需求与研发资源的精准对接?.docx

国央企创新负责人如何实现技术需求与研发资源的精准对接?

国央企创新负责人在推动科技成果转化时,如何快速识别具有商业化潜力的高质量专利?.docx

国央企创新负责人在推动科技成果转化时,如何快速识别具有商业化潜力的高质量专利?

政府科技管理者如何精准掌握区域科技成果分布与转化动态?.docx

政府科技管理者如何精准掌握区域科技成果分布与转化动态?

【数据结构与算法】链表数据结构实现示例5

内容概要:本文提供了一个用Java语言实现的链表数据结构示例,涵盖了链表的基本操作,包括在链表前端和后端插入元素(pushFront、pushBack)、删除指定值的节点(remove)、链表反转(reverse)以及获取链表大小(size)。代码采用泛型设计,支持任意类型的数据存储,并实现了Iterable接口,使得链表可以使用迭代器进行遍历。实现过程中运用了哑节点(dummy node)技巧简化删除操作的边界处理,同时通过内部类Node构建链式存储结构,体现了链表动态分配和指针操作的核心特性。; 适合人群:具备Java基础和数据结构入门知识的初学者,如计算机专业学生或初级开发人员。; 使用场景及目标:①学习链表的基本操作及其Java实现方式;②理解哑节点技巧在链表删除中的应用;③掌握如何为自定义数据结构实现Iterator接口以支持遍历;④为算法练习和面试准备提供代码参考。; 阅读建议:建议读者结合代码逐行理解每个方法的逻辑流程,尤其是指针的移动与链接过程,可通过调试运行验证各项功能,并尝试扩展其他操作(如查找、按索引插入等)以加深理解。

高校技术转移办公室人员如何推动科技成果的高效推介与转化落地?.docx

高校技术转移办公室人员如何推动科技成果的高效推介与转化落地?

政府科技管理者在推动科技成果转化时,如何解决技术成果与产业需求匹配低效的问题?.docx

政府科技管理者在推动科技成果转化时,如何解决技术成果与产业需求匹配低效的问题?

产业园区运营负责人如何提升技术供需匹配精准度?.docx

产业园区运营负责人如何提升技术供需匹配精准度?

政府科技管理者在推动科技成果转化过程中,如何精准识别与筛选高质量技术成果?.docx

政府科技管理者在推动科技成果转化过程中,如何精准识别与筛选高质量技术成果?

2025年现实世界资产(RWA)代币化发展态势与风险防范研究报告-基于全球金融数字化转型背景下的系统性分析与政策建议-清华五道口&IFR-2025-56页.pdf

2025年现实世界资产(RWA)代币化发展态势与风险防范研究报告-基于全球金融数字化转型背景下的系统性分析与政策建议-清华五道口&IFR-2025-56页.pdf

-_基于BMS的储能安全设计与实践-30页.pdf

-_基于BMS的储能安全设计与实践-30页.pdf

2025年金融科技平台对传统金融行业的影响研究——基于信贷业务的视角.pdf

2025年金融科技平台对传统金融行业的影响研究——基于信贷业务的视角.pdf

上一篇: MySQL中间隙锁的加锁机制
下一篇: MySQL的两阶段所协议2PL
程序猿集锦
博客等级 码龄18年 55粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值