[MYSQL]查询单位时间消耗量

news2024/9/22 19:36:19

请求哪位大神给我优化一下mysql语句.

数据库表:(日/月/年 数据表和data_hour结构一样,懒得复制了,不然太长)


DROP TABLE IF EXISTS data_source;#数据源
create table IF not EXISTS  data_source (
num  int unsigned  not null auto_increment PRIMARY KEY   COMMENT'序号   值唯一',
id  varchar(40)  not null  COMMENT 'ID',
data_current  DOUBLE COMMENT '瞬时数据  随时间累加或不变',
data_time    TIMESTAMP COMMENT '数据时间'
)charset=gb2312;


DROP TABLE IF EXISTS data_hour;#YH_ES 小时数据汇总
create table IF not EXISTS  data_hour (
num  int unsigned  not null auto_increment PRIMARY KEY   COMMENT'序号   值唯一',
id  varchar(40)  not null  COMMENT 'ID',
data_s   DOUBLE COMMENT '起始读数',
data_e   DOUBLE COMMENT '末期读数',
hour_data   DOUBLE COMMENT '小时消耗量',
s_time   TIMESTAMP COMMENT '起始读数时间',
e_time   TIMESTAMP COMMENT '期末读数时间'
)charset=gb2312;

查询上一小时消耗量:

计算方法1.当前小时最小时间对应读数 - 上一小时最小时间对应读数

计算方法2.上一小时最大时间对应读数 - 上一小时最小时间对应读数(没做,误差太大,上一小时最大时间对应读数和当前小时最小时间对应读数之间差值没有统计在内.)

方法1实现:

SET @time_result=DATE_FORMAT(DATE_SUB(CURRENT_TIME(),INTERVAL -1 HOUR),'%Y-%m-%d %H');
SET @time_now=DATE_FORMAT(CURRENT_TIME(),'%Y-%m-%d %H');
INSERT INTO test.data_hour ( id, 
data_s,   data_e,   hour_data,
s_time, e_time) 	
SELECT te.id, 
ts.data_current AS data_s,te.data_current AS data_e,
ROUND((te.data_current -ts.data_current),3) AS hour_data,
ts.data_time AS s_time,te.data_time AS e_time FROM
	(SELECT a.id,a.data_current,a.data_time from data_source AS a 
	INNER   JOIN (SELECT m.id id, MIN(m.data_time) min_time from data_source AS m
	WHERE  DATE_FORMAT(data_time,'%Y-%m-%d %H') = @time_result
	GROUP BY id)AS f ON  a.data_time=f.min_time AND a.id=f.id GROUP BY a.id ) AS ts,
	(SELECT a.id,a.data_current,a.data_time  from data_source AS a 
	INNER   JOIN (SELECT m.id id, MIN(m.data_time) min_time from data_source AS m
	WHERE  DATE_FORMAT(data_time,'%Y-%m-%d %H') =@time_now
	GROUP BY id)AS f ON  a.data_time=f.min_time AND a.id=f.id GROUP BY a.id )
AS te WHERE ts.id=te.id;

同理,查询上一天消耗量:

SET @time_result=DATE_FORMAT(DATE_SUB(CURRENT_TIME(),INTERVAL 1 DAY),'%Y-%m-%d');
-- INSERT INTO test.data_day ( id, 
-- data_s,   data_e,   day_data,
-- s_time, e_time) 	
	SELECT te.id,	ts.data_s as data_s,	te.data_e as data_e,
	ROUND((te.data_e -ts.data_s),3) as day_data,
	ts.s_time as s_time,te.e_time as e_time FROM
			(SELECT a.id,a.data_s,a.s_time from data_hour as a 
			INNER   JOIN (SELECT MIN(m.s_time) min_time from data_hour as m
			WHERE  DATE_FORMAT(s_time,'%Y-%m-%d') = @time_result GROUP BY id)as f
			on  a.s_time=f.min_time GROUP BY a.id  ORDER BY  a.id) as ts,
			(SELECT a.id,a.data_e,a.e_time  from data_hour as a 
			INNER   JOIN (SELECT MAX(m.e_time) max_time from data_hour as m
			WHERE  DATE_FORMAT(s_time,'%Y-%m-%d') = @time_result GROUP BY id)as f
			on  a.e_time=f.max_time GROUP BY a.id  ORDER BY  a.id)
	 as te WHERE ts.id=te.id;

同理可算月/年数据

测试:

插入数据:

#define MFT(format,...) std_string_format(format,##__VA_ARGS__)

std::string  std_string_format( const char * _Format, ...) {
	std::string tmp;
	va_list marker = NULL;
	va_start(marker, _Format);
	size_t num_of_chars = _vscprintf(_Format, marker);
	if (num_of_chars >= tmp.capacity()) 
	{
		tmp.resize(num_of_chars + 1);
	}
	vsprintf_s((char *)tmp.data(), tmp.capacity(), _Format, marker);
	va_end(marker);
	string strRet(tmp.data());
	return strRet;
}


/***********
*获取随机数值
*DWORD pt=1, 随机数种子,默认为传入的时间戳
*int min=0,   产生的随机数最小值
*int max=100 ,产生的随机数最大值
*DWORD t=0 ,  防止在循环中使用时候产生的随机数一样
*float dot=0.1f 转换为float的倍数
*返回:随机数
************/
float GetFloatRandValue(DWORD pt=1,int min=0,int max=100 ,DWORD t=0 ,float dot=0.1f)
{
	if (pt==0)
	{
		pt=GetTickCount();
	}
	srand(pt+t);
	float v=(rand()%(max-min+1)+min)*dot;
	return v;

}

/******************
*制作小时数据 一个小时三条数据
*CTools *sqlTool, 数据库操作类指针
*CTime ts,   起始时间 包含
*CTime te,   期末时间  包含
*std::vector<std::string> mAlldev, 设备ID
*返回:无
*********************/
void  SetDataToDB(CTools *sqlTool,CTime ts,CTime te,std::vector<std::string> mAlldev)
{
	float fDataCurrent=0.0f;	//"瞬时数据"
	string strClearSql="TRUNCATE  test.data_source; ";
	sqlTool->delete_sql(strClearSql.data());
	DWORD pt=GetTickCount();
	int n =0;
	CTimeSpan  tsp=te-ts;
	int allMin =(int)tsp.GetTotalMinutes();
	for (int minute = 0; minute <= allMin; minute+=30)
	{
		CTimeSpan  dtsp(0,0,minute,0);
		CTime  tData=ts+dtsp;
		for (int i = 0; i <(int) mAlldev.size(); i++)
		{
			fDataCurrent+=GetFloatRandValue(pt,10,110, n++);
			string mTime=MFT2("%d-%02d-%02d %02d:%02d:%02d",tData.GetYear(),tData.GetMonth(),tData.GetDay(),tData.GetHour(),tData.GetMinute(),n%60);
			string sDevId=mAlldev[i];
			string sqlStr=MFT2("INSERT INTO test.data_source "
					"(id,data_current, data_time) "
					" VALUES ('%s',%.1f, '%s');",
					sDevId.data(),fDataCurrent,mTime.data()
					);
			sqlTool->insert_sql(sqlStr.data());
		}
	}

}

/******************
*计算小时差值,并存入数据库
*CTools *sqlTool, 数据库操作类指针
*CTime ts,   起始时间 包含
*CTime te,   期末时间  包含
*返回:无
**************************/
void CalculateDataOfHour(CTools *sqlTool,CTime ts,CTime te)
{
	string strClearSql="TRUNCATE test.data_hour;";
	sqlTool->delete_sql(strClearSql.data());
	CTimeSpan  tsp=te-ts;
	string sTimeStart=GetTimeStringOfHour(ts);
	int allHour =(int)tsp.GetTotalHours();
	for (int hour = 0; hour <allHour; hour++)
	{
		CTimeSpan tHsp(0,1,0,0);
		ts+=tHsp;
		string sTimeEnd=GetTimeStringOfHour(ts);
		MTRACE("起始:%s  期末:%s\n",sTimeStart.data(),sTimeEnd.data());
		string sqlStr =MFT("INSERT INTO test.data_hour ( id, \n"
							"data_s,   data_e,   hour_data,\n"
							"s_time, e_time) 	\n"
							"	SELECT te.id, \n"
							"	ts.data_current as data_s,te.data_current as data_e,\n"
							"	ROUND((te.data_current -ts.data_current),3) as hour_data,\n"
							"	ts.data_time as s_time,te.data_time as e_time FROM\n"
							"			(SELECT a.id,a.data_current,a.data_time from data_source as a \n"
							"			INNER   JOIN (SELECT MIN(m.data_time) min_time from data_source as m\n"
							"			WHERE  DATE_FORMAT(data_time,'%%Y-%%m-%%d %%H') = '%s' GROUP BY id)as f\n"
							"			on  a.data_time=f.min_time GROUP BY a.id  ORDER BY  a.id) as ts,\n"
							"			(SELECT a.id,a.data_current,a.data_time  from data_source as a \n"
							"			INNER   JOIN (SELECT MIN(m.data_time) min_time from data_source as m\n"
							"			WHERE  DATE_FORMAT(data_time,'%%Y-%%m-%%d %%H') = '%s' GROUP BY id)as f\n"
							"			on  a.data_time=f.min_time GROUP BY a.id  ORDER BY  a.id)\n"
							"	 as te WHERE ts.id=te.id;",sTimeStart.data(),sTimeEnd.data());
		sqlTool->insert_sql(sqlStr.data());
		sTimeStart=sTimeEnd;
	}
}



int _tmain(int argc, _TCHAR* argv[])
{
	
	CTools *sqlTool=new CTools();
	if(!initMysql(sqlTool,"test"))
	{
		printf_s("数据库初始化失败\n");
		delete sqlTool;
		sqlTool=nullptr;
		return 1;
	}
	CTime ts(2023,1,1,0,0,0);
	CTime te(2024,2,1,0,0,0);
	std::vector<std::string> mAlldev;
	mAlldev.push_back("id_1");
	mAlldev.push_back("id_2");
	SetDataToDB(sqlTool,ts,te,mAlldev);
	CalculateDataOfHour(sqlTool,ts,te);
	//CalculateDataOfDay(sqlTool,ts,te);
	system("pause");
	delete sqlTool;
	return 0;
}

结果

1.单小时计算:

 

 按天

 

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

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

相关文章

关于win11 debian wsl 子系统安装启动docker一直starting,无法启动

首先我先说明&#xff0c;我的步骤都是按照官网步骤来的 通过官网的操作步骤 通过测试命令 sudo docker run hello-world得到下面的命令&#xff0c;我们通过启动命令 sudo service docker start 执行结果如下图 也就是说无法启动&#xff0c;一直显示在启动中 遇到这种情况…

Ubuntu安装git

使用 apt-get install git 安装git 报错&#xff1a; 这个错误信息通常表示您的系统上没有可用的 git 软件包。这可能是因为您的软件源列表中没有包含 git 软件包所在的软件源&#xff0c;或者您的软件源列表已经过期。 解决&#xff1a; 如果您使用的是 Ubuntu 或类似…

Vue2与Vue3响应式原理

Vue2的响应式 Vue3的响应式

(杭电多校)2023“钉耙编程”中国大学生算法设计超级联赛(5)

1001 Typhoon 计算几何 对于每一个避难点,计算其到所有线段的距离,取min即可 AC代码&#xff1a; #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<deque> #include<cmath> #include<cstdio&…

【云原生】K8S二进制搭建二:部署CNI网络组件

目录 一、K8S提供三大接口1.1容器运行时接口CRI1.2云原生网络接口CNI1.3云原生存储接口CSI 二、Flannel网络插件2.1K8S中Pod网络通信2.2Overlay Network2.3VXLAN2.4Flannel 三、Flannel udp 模式的工作原理3.1ETCD 之 Flannel 提供说明 四、vxlan 模式4.1Flannel vxlan 模式的工…

Packet Tracer - 配置初始路由器设置

Packet Tracer - 配置初始路由器设置 目标 第 1 部分&#xff1a;检验默认路由器配置 第 2 部分&#xff1a;配置并检验初始路由器配置 第 3 部分&#xff1a;保存运行配置文件 拓扑图 背景信息 在本练习中&#xff0c;您将执行基本的路由器配置。您将使用加密密码和明文…

HDFS架构刨析

HDFS架构刨析 概述HDFS架构图整体概述主角色&#xff1a;namenodefsimage内存元数据镜像文件edits log&#xff08;Journal&#xff09;编辑日志 从角色&#xff1a;datanode主角色辅助角色&#xff1a;secondarynamenode 重要特性主从架构分块存储机制副本机制namespace元数据…

京津冀特大暴雨,带给应急通信工作怎样的启示?

上个月&#xff0c;我发卫星基站中移集采那篇文章的时候&#xff0c;就提到&#xff1a;未来即将进入汛期&#xff0c;应急通信装备将发挥重要作用。 果不其然&#xff0c;没多久&#xff0c;超强台风“杜苏芮”形成并登陆福建&#xff0c;造成巨大破坏。 除了在南方地区的肆虐…

Java工程师研学之路【003Java基础语法下】

知识体系 挑战&#xff08;challenge&#xff09; 从终端输入字符串(输入的个数不超过10个)&#xff0c;当输入遇到end字符串时&#xff0c;结束输入并且打印出之前输入的所有字符串。 思路&#xff1a;首先要输出end之前的所有字符串&#xff0c;故可以使用数组把输入的字符…

zookeeper+kafka分布式消息队列集群的部署

目录 一、zookeeper 1.Zookeeper 定义 2.Zookeeper 工作机制 3.Zookeeper 特点 4.Zookeeper 数据结构 5.Zookeeper 应用场景 &#xff08;1&#xff09;统一命名服务 &#xff08;2&#xff09;统一配置管理 &#xff08;3&#xff09;统一集群管理 &#xff08;4&…

零代码爬虫平台SpiderFlow的安装

什么是 Spider Flow &#xff1f; Spider Flow 是一个高度灵活可配置的爬虫平台&#xff0c;用户无需编写代码&#xff0c;以流程图的方式&#xff0c;即可实现爬虫。该工具支持多数据源、自动保存至数据库、任务监控、抓取 JS 动态渲染页面、插件扩展&#xff08;OCR 识别、邮…

17、YML配置文件及让springboot启动时加载我们自定义的yml配置文件的几种方式

YML配置文件及加载自定义配置文件的几种方式 ★ YAML配置文件 其实本质和.properties文件的是一样的。 Spring Boot默认使用SnakeYml工具来处理YAML配置文件&#xff0c;SnakeYml工具默认就会被spring-boot-starter导入&#xff0c;因此无需开发者做任何额外配置。 YAML本质…

为Android构建现代应用——应用导航设计

在前一章节的实现中&#xff0c;Skeleton: Main structure&#xff0c;我们留下了几个 Jetpack 架构组件&#xff0c;这些组件将在本章中使用&#xff0c;例如 Composables、ViewModels、Navigation 和 Hilt。此外&#xff0c;我们还通过 Scaffold 集成了 TopAppBar 和 BottomA…

论文阅读- Uncovering Coordinated Networks on Social Media:Methods and Case Studies

链接&#xff1a;https://arxiv.org/pdf/2001.05658.pdf 目录 摘要&#xff1a; 引言 Methods Case Study 1: Account Handle Sharing Coordination Detection 分析 Case Study 2: Image Coordination Coordination Detection Analysis Case Study 3: Hashtag Sequen…

Leetcode-每日一题【剑指 Offer 39. 数组中出现次数超过一半的数字】

题目 数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2 限制&#xff1a; 1 < 数组长度 < 50000 解题思路 前置知…

手把手教新手最新Maven3.9.3下载安装配置

当前文档地址&#xff1a;有道云笔记 手把手教新手最新Maven3.9.3下载安装配置 1.下载 Maven官网&#xff1a;Maven – Maven Documentation 1.1打开主页&#xff0c;点击 Download 1.2 选择二进制压缩包&#xff0c;点击apache-maven-3.9.3-bin.zip进行下载 1.3 选择合适的…

租赁类小程序定制开发|租赁管理系统源码|免押租赁系统开发

随着互联网的发展&#xff0c;小程序成为了一种重要的移动应用开发方式。租赁小程序作为其中的一种类型&#xff0c;可以为很多行业提供便利和创新。下面我们将介绍一些适合开发租赁小程序的行业。   房屋租赁行业&#xff1a;租房小程序可以帮助房东和租户快速找到合适的租赁…

史上最全docker启动命令

docker Docker 启动镜像 一、查看当前docker中下载的镜像&#xff0c;如下图&#xff0c;当前我的Docker容器中存在两个镜像 &#xff0c;tomcat、mysql 二、启动镜像 (因启动命令参数过多&#xff0c;同时各种镜像启动时可以增加额外的参数&#xff0c;本次以启动mysql5.6为例…

Manage repositories按钮没有找到

今天安装PyCharm 2022.2.5版本没有发现Manage Repositories&#xff0c;如下图&#xff1a; 解决办法&#xff1a; 第一步&#xff1a;打开pycharm 根据图示按顺序点击底部内容 第二步 &#xff1a;点击加号&#xff0c;添加国内镜像源即可 第三步&#xff1a;国内镜像源地址 …

SpringBoot之Actuator基本使用

SpringBoot之Actuator基本使用 引入分类常用接口含义healthbeansconditionsheapdumpmappingsthreaddumploggersmetrics 引入 <!-- actuator start--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…