如何在MySQL中生成一系列小时平均值?

时间:2009-01-26 11:26:26

标签: sql mysql

我的表中有十分钟的数据:

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.

3 个答案:

答案 0 :(得分:15)

目前还不清楚您是否希望平均值在几天内汇总。

如果您希望在26日午夜和27日午夜有不同的平均值,那么修改Mabwi的查询:

SELECT AVG( value ) , thetime
FROM hourly_averages
GROUP BY DATE( thetime ), HOUR( thetime )

请注意DATE()子句中的其他GROUP BY。如果没有这个,查询会将00:0000: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中,至少对两种方式进行分组似乎大约需要相同的时间。