我有一个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/

10-09 06:25
查看更多