我有一个包含 cpuload、freememory、磁盘空间、cpu 利用率和主机名字段的表。我正在运行一个 cron 作业来获取所有主机(例如:4 个主机)中每 10 分钟的数据。 现在我的数据库中有一年的数据。
我想将该数据转换为每小时平均数据。但我只需要两个月前的数据。最近两个月的数据应该不会干扰。 我的数据是这样的
hostname | cpuload | freedisk | freemem |timestamp
localhost.localdomain | 0.15 | 136052 | 383660 | 2017-08-01 00:10:08
localhost.localdomain | 0.03 | 136492 | 383660 | 2017-08-01 00:20:08
localhost.localdomain | 0.01 | 133456 | 383660 | 2017-08-01 00:30:08
localhost.localdomain | 0.10 | 64544 | 383660 | 2017-08-01 00:40:08
localhost.localdomain | 0.01 | 68148 | 383660 | 2017-08-01 01:00:08
每 10 分钟数据就会添加到今天,即 2017-10-12 11:00:00
现在我想获取两个月前的数据,即从2017-08-12 11:00:00到2017-08-01 00:00:00的数据,我需要转换为每小时数据
SELECT Avg(CpuLoad) AS avgcpuload
,Avg(FreeMemory) AS avgfreemem
,Avg(FreeDisk) AS avgfreedisk
,Avg(Cpu_util) AS avgcpuutil
FROM Dynamic_Host_Information;
我得到了avg
,但我只想要两个月前的数据。
请帮助我。 提前致谢 萨加尔·雷迪
最佳答案
一种方法是按时间戳
列的日期和时间
部分以及where对数据进行
子句排除之前 分组
2
个月的数据,如下所示,以获得您想要的结果。
SELECT t1.hostname
,avg(cpuload) AS cpuload
,avg(freedisk) AS freedisk
,avg(freemem) AS freemem
FROM table1 t1
WHERE t1.TIMESTAMP < current_timestamp - interval '42' day
GROUP BY date_format(t1.TIMESTAMP, '%Y%m%d%H');
INTERVAL '42' DAY
用于排除 Oct
和 Sep
数据。您可以相应地调整它。
结果:
hostname cpuload freedisk freemem
-------------------------------------------------------------
localhost.localdomain 0.072500 117636.0000 383660.0000
localhost.localdomain 0.010000 68148.0000 383660.0000
<小时/>
更新1:
如果您需要相关时间段内的数据。
SELECT t1.hostname
,avg(cpuload) AS cpuload
,avg(freedisk) AS freedisk
,avg(freemem) AS freemem
FROM table1 t1
WHERE t1.TIMESTAMP between '2017-08-01 00:00:00' and '2017-08-12 11:00:00'
GROUP BY date_format(t1.TIMESTAMP, '%Y%m%d%H');
您可以查看演示 here
关于mysql - 需要数据库两个月前每小时的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46701403/