【发布时间】:2015-11-19 08:13:36
【问题描述】:
我需要根据用户设置生成动态结果,以减少通过帖子返回的数量。示例表:
+----------+-------+---------------------+
| cpu_name | used | timestamp |
+----------+-------+---------------------+
| CPU 3 | 0.200 | 2015-11-19 03:09:11 |
| CPU 2 | 0.000 | 2015-11-19 03:09:11 |
| CPU 1 | 0.000 | 2015-11-19 03:09:11 |
| CPU 0 | 0.025 | 2015-11-19 03:09:11 |
| CPU 3 | 0.000 | 2015-11-19 03:09:10 |
| CPU 2 | 0.000 | 2015-11-19 03:09:10 |
| CPU 1 | 0.000 | 2015-11-19 03:09:10 |
| CPU 0 | 0.000 | 2015-11-19 03:09:10 |
| CPU 3 | 0.000 | 2015-11-19 03:09:09 |
| CPU 2 | 0.000 | 2015-11-19 03:09:09 |
| CPU 1 | 0.000 | 2015-11-19 03:09:09 |
| CPU 0 | 0.122 | 2015-11-19 03:09:09 |
| CPU 3 | 0.000 | 2015-11-19 03:09:07 |
| CPU 2 | 0.225 | 2015-11-19 03:09:07 |
| CPU 1 | 0.000 | 2015-11-19 03:09:07 |
| CPU 0 | 0.000 | 2015-11-19 03:09:07 |
| CPU 0 | 0.025 | 2015-11-19 04:45:01 |
+----------+-------+---------------------+
需要对每个 cpu 的行进行平均,每 X 小时/天/等。
伪 SLQ(我如何用一条 SQL 语句做到这一点):
$time = 10
$unit = DAYS
$sample_factor = 1 //hour
for each CPU:
$sql = "SELECT AVERAGE_every_hour(cpu_use) FROM tbl_cpu_use WHERE timestamp > (NOW() - INTERVAL ". $time. " ". $unit)"
RETURN RESULTS BUT AS IF IT WERE ONE QUERY
例如 如果
$time = 1 $unit = Hour $sample_factor = 1 //hour
结果是:
+----------+-------+---------------------+
| cpu_name | used | timestamp |
+----------+-------+---------------------+
| CPU 3 | 0.200 | 2015-11-19 03 |
| CPU 2 | 0.000 | 2015-11-19 03 |
| CPU 1 | 0.000 | 2015-11-19 03 |
| CPU 0 | 0.025 | 2015-11-19 03 |
| CPU 0 | 0.025 | 2015-11-19 05 |
但是如果
$time = 1 $unit = Hour $sample_factor = .5 //hour
结果是
+----------+-------+---------------------+
| cpu_name | used | timestamp |
+----------+-------+---------------------+
| CPU 3 | 0.200 | 2015-11-19 03:00 |
| CPU 2 | 0.000 | 2015-11-19 03:00 |
| CPU 1 | 0.000 | 2015-11-19 03:00 |
| CPU 0 | 0.025 | 2015-11-19 03:00 |
| CPU 3 | 0.200 | 2015-11-19 03:30 |
| CPU 2 | 0.000 | 2015-11-19 03:30 |
| CPU 1 | 0.000 | 2015-11-19 03:30 |
| CPU 0 | 0.025 | 2015-11-19 03:30 |
| CPU 0 | 0.025 | 2015-11-19 05:00 |
注意:忽略结果中的“使用”列值,假设它们是一段时间内的平均值。 'timestamp' 列和平均是最重要的。
编辑: 在 mySQL 工作台中进行试验后,我认为我已经非常接近了(仍然难以确定准确性以及设置间隔的时间,但我认为这已经非常接近了简洁):
注意:在填充数据时添加了一个硬 unix 时间戳,每秒几乎没有额外的处理,这对这部分很有帮助。
SET @time_interval := date_sub(NOW(), INTERVAL 2 HOUR);
SET @sample_interval := 60;
SELECT cpu_name, AVG(used) as used, @sample_interval*AVG(ROUND(unix_timestamp/@sample_interval)) as unix_timestamp FROM
(SELECT cpu_name, used, @sample_interval*ROUND(unix_timestamp/@sample_interval) As unix_timestamp, `timestamp` FROM BH_DB.tbl_cpu_use WHERE `timestamp`>@time_interval ORDER BY id DESC LIMIT 18446744073709551615) AS sorted_table
GROUP BY cpu_name, unix_timestamp ORDER BY unix_timestamp;
【问题讨论】:
-
如果我们将
| CPU 0 | 0.025 | 2015-11-19 04:45 |添加到数据集中呢? -
这取决于采样因子是什么,但在最后一个屏幕截图中,它将被平均以创建一条线 | CPU 0 | 0.025 | 2015-11-19 04:30 |或 | CPU 0 | 0.025 | 2015-11-19 05:00 |;我认为哪一个并不重要,或者即使它是两条线的平均值......每秒一次 4 个 CPU 的 90 天日志是在图表上趋势的大量数据,所以我需要得到样本量减少,但准确和平均似乎是唯一的选择。我知道我可以通过许多查询和一个 PHP 循环来做到这一点,但我听说有一种在 SQL 中处理的超快速方式的传言。
-
请相应地编辑您的问题
-
我现在有。我想你可能会混淆上面的表格。实际的表永远不会得到 2015-11-19 04:45,它也总是得到秒数。我之前的观点是,在平均许多记录时,第 45 秒是向上还是向下取整并不重要,只要它是一致的。
-
我敢肯定,我们至少有一个人很困惑
标签: mysql logging average sampling