我有一个MySQL数据库,用于保存内存数据和时间戳。系统中非常简单的数据,例如已使用的内存和可用的内存总量。
现在,我想对这些数据进行一些简单的计算后创建一个MySQL VIEW,以实现一定程度的数据平滑(使用滚动窗口取平均值)。
初始表如下所示:
id |date |mem_used |mem_total
1 |2012-03-16 23:29:05 |467 |1024
2 |2012-03-16 23:30:05 |432 |1024
3 |2012-03-16 23:31:05 |490 |1024
4 |2012-03-16 23:33:05 |501 |1024
5 |2012-03-16 23:35:05 |396 |1024
6 |2012-03-16 23:39:05 |404 |1536
7 |2012-03-16 23:43:05 |801 |1536
创建的VIEW应该类似于以下内容:
id |date |mem_used |mem_total |mem_5_min_avg |mem_rate_usage
1 |2012-03-16 23:29:05 |467 |1024 |473 |0.46191406
2 |2012-03-16 23:30:05 |432 |1024 |455 |0.44433594
3 |2012-03-16 23:31:05 |490 |1024 |463 |0.45214844
4 |2012-03-16 23:33:05 |501 |1024 |449 |0.43847656
5 |2012-03-16 23:35:05 |396 |1024 |396 |0.38671875
6 |2012-03-16 23:39:05 |404 |1536 |603 |0.39257813
7 |2012-03-16 23:43:05 |801 |1536 |801 |0.52148438
要求:
前3列相同,但考虑到mem_total相同(mem_total正在更改),mem_5_min_avg列应包含接下来5分钟的平均已用内存。
因此,应按以下方式计算以下行:
mem_5_min_avg列的第一行(467 + 432 + 490 + 501)/ 4 = 1890/4 = 472.5 = 473 mem_5_min_avg列的第二行(432 + 490 + 501 + 396)/ 4 = 1819/4 = 454.75 = 455
mem_5_min_avg列的第三行(490 + 501 + 396)/ 3 = 1387/4 = 462.33 = 463
mem_5_min_avg列的第四行(501 + 396)/ 2 = 897/2 = 448.5 = 449
mem_5_min_avg列396的第五行mem_5_min_avg列的第六行(404 + 801)/ 2 = 1205/2 = 602.5 = 603
mem_5_min_avg列801的第七行
在计算完mem_5_min_avg之后,我需要mem_rate_usage列,该列显示以百分比为单位的已使用内存量的简单比率。
mem_rate_usage = mem_5_min_avg / mem_total
例如,应按463/1024 = 0.45214844计算mem_rate_usage的第三行,而应按801/1536 = 0.52148438那样计算最后一列
我不知道如何解决这个问题。我已经尝试将“ AVG”功能与“ GROUP by”结合使用,但实际上我不想在此处进行任何分组。我希望在创建的视图中具有相同数量的行和数据,此外还要具有平滑的数据和速率。
最佳答案
SELECT
rrd1.id,
rrd1.date,
rrd1.mem_used,
rrd1.mem_total,
(
SELECT
CEILING(AVG(rrd2.mem_used))
FROM
rrd rrd2
WHERE
rrd2.date >= rrd1.date AND
rrd2.date <= AddTime(rrd1.date, '00:05')
) AS mem_5_min_avg
FROM
rrd rrd1
关于mysql - MySQL数据平滑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9746386/