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分钟获取一列的平均值的主要内容,如果未能解决你的问题,请参考以下文章