我的表中有十分钟的数据:
2009-01-26 00:00:00 12
2009-01-26 00:10:00 1.1
2009-01-26 00:20:00 11
2009-01-26 00:30:00 0
2009-01-26 00:40:00 5
2009-01-26 00:50:00 3.4
2009-01-26 01:00:00 7
2009-01-26 01:10:00 7
2009-01-26 01:20:00 7.2
2009-01-26 01:30:00 3
2009-01-26 01:40:00 25
2009-01-26 01:50:00 4
2009-01-26 02:00:00 3
2009-01-26 02:10:00 4
etc.
是否可以为MySQL制定一个SQL查询,它将返回每小时的一系列平均值?
在这种情况下,它应该返回:
5.42
8.87
etc.
答案 0 :(得分:15)
目前还不清楚您是否希望平均值在几天内汇总。
如果您希望在26日午夜和27日午夜有不同的平均值,那么修改Mabwi的查询:
SELECT AVG( value ) , thetime
FROM hourly_averages
GROUP BY DATE( thetime ), HOUR( thetime )
请注意DATE()
子句中的其他GROUP BY
。如果没有这个,查询会将00:00
到00:59
的所有数据放在一起,而不考虑它发生的日期。
答案 1 :(得分:3)
这应该有效:
SELECT AVG( value ) , thetime
FROM hourly_averages
GROUP BY HOUR( thetime )
这是结果
AVG(value) thetime
5.4166666865349 2009-01-26 00:00:00
8.8666666348775 2009-01-26 01:00:00
3.5 2009-01-26 02:00:00
答案 2 :(得分:1)
考虑到日期在数据库中具有字符串表示这一事实,还有另一种可能性:
您可以使用SUBSTRING(thetime, 1, [len])
来提取组的公共部分。对于每小时平均的示例,您可以使用SQL查询
SELECT SUBSTRING(thetime, 1, 13) AS hours, AVG(value) FROM hourly_averages GROUP BY hours
通过len
参数,您可以考虑MySQL日期格式yyyy-MM-dd HH:mm:ss[.SS...]
来指定汇总时间间隔:
len = 4
:按年份分组len = 7
:按月分组len = 10
:按天分组len = 13
:按小时分组len = 16
:按分钟分组len = 19
:按秒分组与使用日期和时间函数相比,我们遇到了这种方法的更好性能,尤其是在MySQL 5.7中的JOIN中使用时。但是,在MySQL 8中,至少对两种方式进行分组似乎大约需要相同的时间。