MYSQL每10分钟获取一列的平均值

Posted

技术标签:

【中文标题】MYSQL每10分钟获取一列的平均值【英文标题】:MYSQL Get the average of a column each 10 minutes 【发布时间】:2021-08-07 18:50:24 【问题描述】:

我有一个表 test 包含 1 分钟步长的数据,这里是它的摘录:

DATE_TIME VALUE_G
2016-01-01 00:30:00 0.0
2016-01-01 00:31:00 0.0
2016-01-01 00:32:00 0.0
2016-01-01 00:33:00 0.0
2016-01-01 00:34:00 0.0
2016-01-01 00:35:00 0.0
2016-01-01 00:36:00 0.0
2016-01-01 00:37:00 0.0
2016-01-01 00:38:00 0.09
2016-01-01 00:39:00 0.8
2016-01-01 00:40:00 1.1
2016-01-01 00:41:00 1.1
2016-01-01 00:42:00 1.1
2016-01-01 00:43:00 0.77
2016-01-01 00:44:00 0.37
2016-01-01 00:45:00 0.37
2016-01-01 00:46:00 0.37
2016-01-01 00:47:00 0.52
2016-01-01 00:48:00 0.65
2016-01-01 00:49:00 0.4
2016-01-01 00:50:00 0.27

我想每 10 分钟获取一次VALUE_G 的平均值,但我希望平均值计算如下:

DATE_TIME_AGG AVG(VALUE_G)
2016-01-01 00:30:00 0.0
2016-01-01 00:40:00 0.199
2016-01-01 00:50:00 0.592

在上面的示例中,对于第一行,计算第二行中“2016-01-01 00:21:00”和“2016-01-01 00:30:00”之间的 DATE_TIME 的平均值:在“2016-01-01 00:31:00”和“2016-01-01 00:40:00”之间,第三行在“2016-01-01 00:41:00”和“2016-01”之间-01 00:50:00”。知道表test 包含大量数据,我该如何实现这一点。

按照这个答案https://***.com/a/4073342/15648345 我可以完成部分工作,但是,平均值不是我想要的。这是代码:

select from_unixtime(ROUND(unix_timestamp(DATE_TIME) / (60*10)) * 60 * 10) as DATE_TIME_AGG ,AVG(VALUE_G)
from test
group by DATE_TIME_AGG;

【问题讨论】:

你的mysql是什么版本 我正在使用 Mysql Workbench 6.3 我认为 MySQL 服务器版本的问题更大。运行查询SELECT VERSION(); 得到它。 @BillKarwin 我正在使用 MySQL 版本 5.7.20-log 【参考方案1】:

使用CEIL() 而不是ROUND()

您将DATE_TIME 值减少到十分钟存储桶以进行聚合的from_unixtime(ROUND(unix_timestamp(DATE_TIME) / (60*10)) * 60 * 10) 方法已接近。因为它包含ROUND() 它映射

2016-01-01 00:30 to 2016-01-01 00:30  (minutes 25-34 map to 30)
2016-01-01 00:35 to 2016-01-01 00:30  (minutes 35-44 map to 40)

根据您的问题,您需要此映射。

2016-01-01 00:30 to 2016-01-01 00:30    (minutes 21-30 map to 30)
2016-01-01 00:31 to 2016-01-01 00:40    (minutes 31-40 map to 40)

因此,您需要DATE_TIME 上的一个函数来执行该特定映射。我相信,通过使用CEIL() 代替ROUND(),这对你有用。

  from_unixtime(CEIL(unix_timestamp(DATE_TIME) / (60*10)) * 60 * 10) 

在这里查看。 https://www.db-fiddle.com/f/ufuCQ82vYc6oueBnkNbAJ5/0

【讨论】:

【参考方案2】:

你可以试试下面的查询

SELECT date_format(date_time,'%Y-%m-%d %H:00')  +
            interval (minute(date_time) - case when minute(date_time) mod 10 = 0 then 0  else (-10+minute(date_time) mod 10)  end  ) minute as datestamp,
avg(value_g)
    FROM test
    group by 1
    order by 1

【讨论】:

感谢您的回复,您的查询将文件聚合到所需的时间戳,但是,当涉及到平均值时,它是在“2016-01-01 00:30:00”和第一行的“2016-01-01 00:39:00”,第二行的“2016-01-01 00:40:00”和“2016-01-01 00:49:00”之间,以及第三行的“2016-01-01 00:50:00”和“2016-01-01 00:59:00”。有没有办法获得所需时间戳的平均值? 试试当前的。你以前试过。我在几分钟前更新了同样的内容

以上是关于MYSQL每10分钟获取一列的平均值的主要内容,如果未能解决你的问题,请参考以下文章

计算 R 中矩阵每一列的平均值

尝试使用 MySQL 创建具有同一表中另一列的季节至今平均值的列

Python-表示一列的每n个值

如何根据R中的另一列获取一列的平均值

MySQL 24 小时平均 10 分钟

mysql查询每小时平均值