代码之家  ›  专栏  ›  技术社区  ›  Christian Studer delphist

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

  •  9
  • Christian Studer delphist  · 技术社区  · 17 年前

    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.
    
    2 回复  |  直到 17 年前
        1
  •  16
  •   Alnitak    17 年前

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

    如果您希望26日午夜与27日午夜的平均值不同,请修改Mabwi的查询,如下所示:

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

    注意附加的 DATE() 在 GROUP BY 00:00 到 00:59 不管发生的日期。

        2
  •  3
  •   MattBelanger    17 年前

    这应该起作用:

    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
    
        3
  •  1
  •   Madjosz    6 年前

    考虑到数据库中日期具有字符串表示形式,还有另一种可能性:

    你可以用 SUBSTRING(thetime, 1, [len]) ,提取组的公共部分。对于具有小时平均值的示例,您有SQL查询

    SELECT SUBSTRING(thetime, 1, 13) AS hours, AVG(value) FROM hourly_averages GROUP BY hours
    

    由 len yyyy-MM-dd HH:mm:ss[.SS...] :

    • len = 4 :按年份分组
    • len = 7 :按月分组
    • len = 10 :按天分组
    • len = 13 :按小时分组
    • len = 16 :按分钟分组
    • len = 19

    与使用日期和时间函数相比,这种方法的性能更好,尤其是在MySQL 5.7中用于连接时。然而,在MySQL 8中,至少对两种方式进行分组似乎需要大约相同的时间。