MySQL基于异步时间和平均值加入两个表 [英] Mysql JOIN two tables based on async time and average values

查看:100
本文介绍了MySQL基于异步时间和平均值加入两个表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我记录了来自温度和湿度传感器的值,

I recorded values from temperature and humidity sensors, like that :

mysql> SELECT date,valeur FROM temperature WHERE date >= NOW() - INTERVAL 2 HOUR;
+---------------------+--------+
| date                | valeur |
+---------------------+--------+
| 2013-09-26 11:30:40 |   25.2 |
| 2013-09-26 11:33:19 |   25.4 |
| 2013-09-26 11:34:12 |   25.5 |
| 2013-09-26 11:38:37 |   25.4 |
| 2013-09-26 11:39:30 |   25.4 |
| 2013-09-26 11:40:23 |   25.4 |
| 2013-09-26 11:43:02 |   25.4 |
| 2013-09-26 11:45:41 |   25.3 |
| 2013-09-26 11:47:33 |   25.3 |
| 2013-09-26 11:51:07 |   25.4 |
| 2013-09-26 11:51:52 |   25.3 |
| 2013-09-26 11:53:38 |   25.4 |
...
| 2013-09-26 12:26:20 |   25.5 |
| 2013-09-26 12:27:12 |   25.5 |
| 2013-09-26 12:32:30 |   25.4 |
| 2013-09-26 12:35:09 |   25.5 |
| 2013-09-26 12:36:02 |   25.5 |
| 2013-09-26 12:37:50 |   25.6 |
| 2013-09-26 12:40:27 |   25.6 |
| 2013-09-26 12:49:18 |   25.6 |
| 2013-09-26 12:52:54 |   25.6 |
...
| 2013-09-26 13:16:40 |   25.5 |
| 2013-09-26 13:17:33 |   25.6 |
| 2013-09-26 13:22:05 |   25.5 |
| 2013-09-26 13:22:51 |   25.5 |
| 2013-09-26 13:23:44 |   25.5 |
| 2013-09-26 13:24:37 |   25.5 |
| 2013-09-26 13:25:30 |   25.5 |
| 2013-09-26 13:28:09 |   25.6 |
+---------------------+--------+

mysql> SELECT date,valeur FROM humidite WHERE date >= NOW() - INTERVAL 2 HOUR;
+---------------------+--------+
| date                | valeur |
+---------------------+--------+
| 2013-09-26 11:30:40 |     78 |
| 2013-09-26 11:33:19 |     78 |
| 2013-09-26 11:34:12 |     78 |
| 2013-09-26 11:38:37 |     78 |
| 2013-09-26 11:39:30 |     78 |
| 2013-09-26 11:40:23 |     78 |
| 2013-09-26 11:43:02 |     79 |
| 2013-09-26 11:45:41 |     78 |
| 2013-09-26 11:47:33 |     78 |
| 2013-09-26 11:51:07 |     79 |
| 2013-09-26 11:51:52 |     79 |
| 2013-09-26 11:53:38 |     79 |
...
| 2013-09-26 12:22:48 |     78 |
| 2013-09-26 12:26:20 |     78 |
| 2013-09-26 12:27:12 |     78 |
| 2013-09-26 12:32:30 |     77 |
| 2013-09-26 12:35:09 |     77 |
| 2013-09-26 12:36:02 |     77 |
| 2013-09-26 12:37:50 |     78 |
| 2013-09-26 12:40:27 |     77 |
| 2013-09-26 12:43:06 |     78 |
| 2013-09-26 13:22:05 |     78 |
...
| 2013-09-26 13:22:51 |     78 |
| 2013-09-26 13:23:44 |     78 |
| 2013-09-26 13:24:37 |     78 |
| 2013-09-26 13:25:30 |     78 |
| 2013-09-26 13:28:09 |     78 |
+---------------------+--------+

来自这篇文章我使用了此mysql命令来加入两张表,自24小时以来每小时获得一个值:

From this post I used this mysql command to join the two tables and get one value for each hour since 24 hours :

SELECT DATE_FORMAT(timeTable.minuteTime, '%Y-%m-%d %k:%i') date,
T2.valeur temp,
P2.valeur hum
FROM
(
    SELECT minuteTime.minuteTime minuteTime,
    ( SELECT MAX(date) FROM temperature WHERE date <= minuteTime.minuteTime AND date >= NOW() - INTERVAL 1 DAY) tempTime,
    ( SELECT MAX(date) FROM humidite WHERE date <= minuteTime.minuteTime AND date >= NOW() - INTERVAL 1 DAY) humTime
    FROM
    (
        SELECT DATE(date) + INTERVAL (HOUR(date) DIV 1 * 1) HOUR minuteTime
        FROM humidite
        WHERE date >= NOW() - INTERVAL 1 DAY AND date <= NOW()
        UNION SELECT DATE(date) + INTERVAL (HOUR(date) DIV 1 * 1) HOUR
        FROM temperature
        WHERE date >= NOW() - INTERVAL 1 DAY AND date <= NOW()
        GROUP BY 1
    ) minuteTime
) timeTable
LEFT JOIN temperature T2 ON T2.date = timeTable.tempTime
LEFT JOIN humidite P2 ON P2.date = timeTable.humTime
ORDER BY minuteTime ASC;

它工作得很好,但是我真的不明白如何选择值(间隔是随机的吗?).我希望每个小时取一个平均值:

It works well, but I don't really understand how the value is chosen (random in the interval ?). I would prefer an average for each hour instead :

+------------------+------+------+
| date             | temp | hum  |
+------------------+------+------+
| 2013-09-25 13:00 | NULL | NULL |
| 2013-09-25 14:00 | 25.1 |   80 |
| 2013-09-25 15:00 | 25.3 |   78 |
| 2013-09-25 16:00 | 25.6 |   75 |
| 2013-09-25 17:00 | 25.5 |   75 |
| 2013-09-25 18:00 | 25.0 |   78 |
| 2013-09-25 19:00 | 24.2 |   80 |
| 2013-09-25 20:00 | 23.9 |   84 |
| 2013-09-25 21:00 | 23.9 |   84 |
| 2013-09-25 22:00 | 24.1 |   83 |
| 2013-09-25 23:00 | 24.1 |   83 |
| 2013-09-26 0:00  | 24.0 |   82 |
| 2013-09-26 1:00  | 23.9 |   84 |
| 2013-09-26 2:00  | 23.7 |   86 |
| 2013-09-26 3:00  | 23.7 |   84 |
| 2013-09-26 4:00  | 23.7 |   85 |
| 2013-09-26 5:00  | 23.4 |   85 |
| 2013-09-26 6:00  | 23.6 |   85 |
| 2013-09-26 7:00  | 23.7 |   85 |
| 2013-09-26 8:00  | 24.0 |   84 |
| 2013-09-26 9:00  | 24.4 |   82 |
| 2013-09-26 10:00 | 24.6 |   81 |
| 2013-09-26 11:00 | 25.2 |   79 |
| 2013-09-26 12:00 | 25.4 |   79 |
| 2013-09-26 13:00 | 25.6 |   78 |
+------------------+------+------+
25 rows in set (1.11 sec)

您知道如何将AVG()放入此代码吗?

Do you know how to put the AVG() in this code ?

奖金问题:我将代码更改为每小时获得一个值.您知道如何每30分钟获得1个​​值吗?

Bonus question : I changed the code to get one value for each hour. Do you know how to get 1 value every 30 min ?

感谢您的帮助

推荐答案

感谢Tom Mac和该站点上的其他有用帖子,我最终获得了以下代码:

Thanks to Tom Mac and other usefull posts on this site, I ended up with this code :

select DATE_FORMAT(timeTable.minuteTime, '%Y-%m-%d %k:%i') as date,
  (UNIX_TIMESTAMP(timeTable.minuteTime)*1000) AS dte,
  T2.valeur as avgTemp,
  P2.valeur as avgHum
  FROM ( 
    SELECT minuteTime.minuteTime minuteTime,      
    ( SELECT MAX(date) FROM temperature WHERE date <= minuteTime.minuteTime AND
     date >= NOW() - INTERVAL 170 HOUR) tempTime,
    ( SELECT MAX(date) FROM humidite WHERE date <= minuteTime.minuteTime AND
     date >= NOW() - INTERVAL 170 HOUR) humTime
    FROM( 
     SELECT date + INTERVAL 59 - SECOND( date ) SECOND minuteTime
     FROM humidite
     WHERE date >= NOW() - INTERVAL 7 DAY AND date <= NOW()
     UNION SELECT date + INTERVAL 59 - SECOND( date ) SECOND
     FROM temperature
     WHERE date >= NOW() - INTERVAL 7 DAY AND date <= NOW()
     GROUP BY 1
    ) minuteTime
  ) timeTable
  LEFT JOIN temperature T2 ON T2.date = timeTable.tempTime
  LEFT JOIN humidite P2 ON P2.date = timeTable.humTime
  group by FROM_UNIXTIME( TRUNCATE(UNIX_TIMESTAMP(timeTable.minuteTime) / 1800,0)*1800)
  ORDER BY minuteTime ASC;

现在,我可以使用我在这里输入的专用php代码来计算每小时的露点(以供参考):

Now I'm able to compute dew points for each hour using a dedicated php code that I put here (for information) :

function calculateDewPoint($temperature, $humidity) {
    $a = 17.27 ;
    $b = 237.7 ;

    $c = (($a * $temperature) / ($b + $temperature) ) + Log($humidity/100) ;
    $d = (($b * $c)/($a - $c));
    return number_format($d, 1);
}

下一个更新将直接将此代码放入mysql请求中.

Next update would be to put this code directly in mysql request..

最诚挚的问候

这篇关于MySQL基于异步时间和平均值加入两个表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆