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