Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

sql

mysql

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      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.

Is it possible to formulate a single SQL-query for MySQL which will return a series of averages over each hour?

In this case it should return:

5.42
8.87
etc.
like image 743
Christian Studer Avatar asked Jan 26 '09 11:01

Christian Studer


People also ask

How do I get hourly data from SQL query?

Here is the SQL query to get data for every hour in MySQL. In the above query, we simply group by order_date using HOUR function and aggregate amount column using SUM function. HOUR function retrieves hour number from a given date/time/datetime value, which can be provided as a literal string or column name.

How does MySQL calculate rolling average?

MySQL Rolling AverageFor each row in our count table, we join every row that was within the past seven days and take the average. This query automatically handles date gaps, as we are looking at rows within a date range rather than the preceding N rows.

How do you find the average of two numbers in SQL?

AVG() function is an aggregate function that calculates the average value of a numerical dataset that returns from the SELECT statement.

How do you calculate daily average in SQL?

The daily average is then calculated by dividing the monthly count by the number of days in a month so that we know how much the daily count contributed towards the monthly total.


3 Answers

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.

like image 120
Madjosz Avatar answered Oct 16 '22 21:10

Madjosz


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.

like image 36
Alnitak Avatar answered Oct 16 '22 22:10

Alnitak


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
like image 38
MattBelanger Avatar answered Oct 16 '22 21:10

MattBelanger