如何在 MySQL 中按小时计算温度值的平均值。另外如何计算 3 小时、6 小时、9 小时和 12 小时的平均温度?
How to find AVERAGE of temperature values on hourly basis in MySQL. Also how to calculate average temp on 3hour, 6hr, 9hr and 12hr basis?
我正在使用 Raspberry Pi 和 DHT11 在 MySQL 数据库 中每 5 分钟记录一次温度和湿度数据。
MariaDB [measurements]> desc measurements;
+-------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------+------+-----+---------+-------+
| ttime | datetime | YES | | NULL | |
| temperature | float(4,1) | YES | | NULL | |
| humidity | float(4,1) | YES | | NULL | |
+-------------+------------+------+-----+---------+-------+
3 rows in set (0.004 sec)
MariaDB [measurements]> select * from measurements order by ttime limit 10;
+---------------------+-------------+----------+
| ttime | temperature | humidity |
+---------------------+-------------+----------+
| 2021-01-06 22:10:03 | 28.0 | 59.0 |
| 2021-01-06 22:14:56 | 30.0 | 52.0 |
| 2021-01-06 22:19:47 | 30.0 | 93.0 |
| 2021-01-06 22:54:39 | 28.0 | 57.0 |
| 2021-01-06 23:16:51 | 27.0 | 59.0 |
| 2021-01-06 23:18:04 | 28.0 | 60.0 |
| 2021-01-06 23:19:36 | 27.0 | 59.0 |
| 2021-01-06 23:21:16 | 27.0 | 59.0 |
| 2021-01-07 00:35:39 | 28.0 | 60.0 |
| 2021-01-07 00:37:03 | 27.0 | 60.0 |
+---------------------+-------------+----------+
10 rows in set (0.004 sec)
我能够根据以下代码找到 每天 的平均温度:
MariaDB [measurements]> select avg(temperature),datediff(sysdate(),ttime) diff
-> from measurements
-> group by diff
-> order by ttime desc limit 10;
+------------------+------+
| avg(temperature) | diff |
+------------------+------+
| 25.25000 | 0 |
| 26.02041 | 1 |
| 27.00000 | 2 |
| 26.00000 | 3 |
| 26.26490 | 4 |
| 26.08187 | 5 |
| 27.33333 | 6 |
| 28.12500 | 7 |
+------------------+------+
8 rows in set (0.010 sec)
我想获得 每小时的平均温度 因此输出可以如下所示:
(例如,第一个读数是 2021-01-06 上午 10 点,平均温度为 28.0。此平均值是根据 9:00 上午和 10:00 上午之间获取的读数计算得出的)
Expected output:
+---------------------+-------------+
| ttime | AVG Temp |
+---------------------+-------------+
| 2021-01-06 10:00:00 | 28.0 |
| 2021-01-06 09:00:00 | 30.0 |
| 2021-01-06 08:00:00 | 30.0 |
| 2021-01-06 07:00:00 | 28.0 |
| 2021-01-06 06:00:00 | 27.0 |
| 2021-01-06 05:00:00 | 28.0 |
| 2021-01-06 04:00:00 | 27.0 |
| 2021-01-06 03:00:00 | 27.0 |
| 2021-01-06 02:00:00 | 28.0 |
| 2021-01-06 01:00:00 | 27.0 |
+---------------------+-------------+
对于每小时,将有(60 分钟/5 分钟)= 12 个读数。所以每行输出包含最多 12 个读数的平均值。
我知道 timediff 命令,但不确定这会有什么帮助。
MariaDB [measurements]> select timediff(sysdate(), ttime)
-> from measurements
-> order by ttime
-> desc
-> limit 10;
+----------------------------+
| timediff(sysdate(), ttime) |
+----------------------------+
| 00:02:28 |
| 00:07:28 |
| 00:12:28 |
| 00:17:28 |
| 00:22:28 |
| 00:27:28 |
| 00:32:26 |
| 00:37:28 |
| 00:42:28 |
| 00:47:28 |
+----------------------------+
10 rows in set (0.005 sec)
如有任何帮助,我们将不胜感激。
你可以使用 hour()
select avg(temperature),date(ttime), hour(ttime)
from measurements
group by date(ttime), hour(ttime)
order by date(ttime) desc, hour(ttime) desc limit 10;
我正在使用 Raspberry Pi 和 DHT11 在 MySQL 数据库 中每 5 分钟记录一次温度和湿度数据。
MariaDB [measurements]> desc measurements;
+-------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------+------+-----+---------+-------+
| ttime | datetime | YES | | NULL | |
| temperature | float(4,1) | YES | | NULL | |
| humidity | float(4,1) | YES | | NULL | |
+-------------+------------+------+-----+---------+-------+
3 rows in set (0.004 sec)
MariaDB [measurements]> select * from measurements order by ttime limit 10;
+---------------------+-------------+----------+
| ttime | temperature | humidity |
+---------------------+-------------+----------+
| 2021-01-06 22:10:03 | 28.0 | 59.0 |
| 2021-01-06 22:14:56 | 30.0 | 52.0 |
| 2021-01-06 22:19:47 | 30.0 | 93.0 |
| 2021-01-06 22:54:39 | 28.0 | 57.0 |
| 2021-01-06 23:16:51 | 27.0 | 59.0 |
| 2021-01-06 23:18:04 | 28.0 | 60.0 |
| 2021-01-06 23:19:36 | 27.0 | 59.0 |
| 2021-01-06 23:21:16 | 27.0 | 59.0 |
| 2021-01-07 00:35:39 | 28.0 | 60.0 |
| 2021-01-07 00:37:03 | 27.0 | 60.0 |
+---------------------+-------------+----------+
10 rows in set (0.004 sec)
我能够根据以下代码找到 每天 的平均温度:
MariaDB [measurements]> select avg(temperature),datediff(sysdate(),ttime) diff
-> from measurements
-> group by diff
-> order by ttime desc limit 10;
+------------------+------+
| avg(temperature) | diff |
+------------------+------+
| 25.25000 | 0 |
| 26.02041 | 1 |
| 27.00000 | 2 |
| 26.00000 | 3 |
| 26.26490 | 4 |
| 26.08187 | 5 |
| 27.33333 | 6 |
| 28.12500 | 7 |
+------------------+------+
8 rows in set (0.010 sec)
我想获得 每小时的平均温度 因此输出可以如下所示:
(例如,第一个读数是 2021-01-06 上午 10 点,平均温度为 28.0。此平均值是根据 9:00 上午和 10:00 上午之间获取的读数计算得出的)
Expected output:
+---------------------+-------------+
| ttime | AVG Temp |
+---------------------+-------------+
| 2021-01-06 10:00:00 | 28.0 |
| 2021-01-06 09:00:00 | 30.0 |
| 2021-01-06 08:00:00 | 30.0 |
| 2021-01-06 07:00:00 | 28.0 |
| 2021-01-06 06:00:00 | 27.0 |
| 2021-01-06 05:00:00 | 28.0 |
| 2021-01-06 04:00:00 | 27.0 |
| 2021-01-06 03:00:00 | 27.0 |
| 2021-01-06 02:00:00 | 28.0 |
| 2021-01-06 01:00:00 | 27.0 |
+---------------------+-------------+
对于每小时,将有(60 分钟/5 分钟)= 12 个读数。所以每行输出包含最多 12 个读数的平均值。
我知道 timediff 命令,但不确定这会有什么帮助。
MariaDB [measurements]> select timediff(sysdate(), ttime)
-> from measurements
-> order by ttime
-> desc
-> limit 10;
+----------------------------+
| timediff(sysdate(), ttime) |
+----------------------------+
| 00:02:28 |
| 00:07:28 |
| 00:12:28 |
| 00:17:28 |
| 00:22:28 |
| 00:27:28 |
| 00:32:26 |
| 00:37:28 |
| 00:42:28 |
| 00:47:28 |
+----------------------------+
10 rows in set (0.005 sec)
如有任何帮助,我们将不胜感激。
你可以使用 hour()
select avg(temperature),date(ttime), hour(ttime)
from measurements
group by date(ttime), hour(ttime)
order by date(ttime) desc, hour(ttime) desc limit 10;