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

MYSQL Get the average of a column each 10 minutes

我有一个 table 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"。我怎样才能知道 table test 包含大量数据。

按照这个回答我可以完成部分工作,但是,平均值不是我想要的。这是代码:

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;

您可以尝试以下查询

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

使用 CEIL() 代替 ROUND()

您的 from_unixtime(ROUND(unix_timestamp(DATE_TIME) / (60*10)) * 60 * 10)DATE_TIME 值减少到十分钟桶以进行聚合的方法即将完成。因为它包含 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