How do I generate a series of hourly averages in MySQL?

前端 未结 3 1098
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-15 10:23

I\'ve got data in ten minutes intervals in my table:

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         


        
相关标签:
3条回答
  • 2020-12-15 11:02

    There is also another possibility considering the fact that dates have a string representation in the database:

    You can use SUBSTRING(thetime, 1, [len]), extracting the common part of your group. For the example with hourly averages you have the SQL query

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

    By the len parameter you can specify the aggregated time interval considering the MySQL date format yyyy-MM-dd HH:mm:ss[.SS...]:

    • len = 4: group by years
    • len = 7: group by months
    • len = 10: group by days
    • len = 13: group by hours
    • len = 16: group by minutes
    • len = 19: group by seconds

    We encountered a better performance of this method over using date and time function, especially when used in JOINs in MySQL 5.7. However in MySQL 8 at least for grouping both ways seem to take approximately the same time.

    0 讨论(0)
  • 2020-12-15 11:05

    This should work:

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

    Here's the result

    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
    
    0 讨论(0)
  • 2020-12-15 11:18

    It's unclear whether you want the average to be aggregated over days or not.

    If you want a different average for midnight on the 26th vs midnight on the 27th, then modify Mabwi's query thus:

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

    Note the additional DATE() in the GROUP BY clause. Without this, the query would average together all of the data from 00:00 to 00:59 without regard to the date on which it happened.

    0 讨论(0)
提交回复
热议问题