mysql查询平均加入1个表中的3个查询 [英] mysql query to join 3 queries in 1 table while averaging

查看:99
本文介绍了mysql查询平均加入1个表中的3个查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有3个非常大的表,每分钟都会记录一次值, 下面是这些表的提取.

I have 3 very large tables, with values getting logged every minute, below is an extract of these tables.

我想获取这些表的 1天时段的每小时平均值,并根据时间加入它们,请注意,ph和温度的记录时间之间有几秒钟的差距

I would like to get hourly averages for a period of 1 Day of these tables and join them with respect to time, please note there is a couple of seconds gap between log time for ph and temperature

表PH (仅用于提取,该表非常大,具有超过130,000个值)

Table PH (extract only, this table is very large with more than 130,000 values)

    ID      time                Ph

    72176   2013-04-06 03:29:34 7.58
    72177   2013-04-06 03:30:34 7.58
    72178   2013-04-06 03:31:34 7.54
    72179   2013-04-06 03:32:34 7.58
    72180   2013-04-06 03:33:34 7.58
    72181   2013-04-06 03:34:34 7.58
    72182   2013-04-06 03:35:34 7.54
    72183   2013-04-06 03:36:34 7.58
    72184   2013-04-06 03:37:34 7.54
    72185   2013-04-06 03:38:34 7.58
    72186   2013-04-06 03:39:34 7.58

表温度1 (仅提取,此表非常大,具有超过130,000个值)

Table temperature1 (extract only, this table is very large with more than 130,000 values)

    ID      time            temperature

133312  2013-04-06 03:29:36 25.37
133313  2013-04-06 03:30:36 25.37
133314  2013-04-06 03:31:36 25.37
133315  2013-04-06 03:32:36 25.31
133316  2013-04-06 03:33:36 25.31
133317  2013-04-06 03:34:36 25.31
133318  2013-04-06 03:35:36 25.37
133319  2013-04-06 03:36:36 25.31
133320  2013-04-06 03:37:36 25.31
133321  2013-04-06 03:38:36 25.31
133322  2013-04-06 03:39:36 25.37

表格实体 (仅提取,此表格非常大,具有超过130,000个值)

Table solids (extract only, this table is very large with more than 130,000 values)

    ID      time            solids

123791  2013-04-06 03:29:49 140
123792  2013-04-06 03:30:49 140
123793  2013-04-06 03:31:49 143
123794  2013-04-06 03:32:49 140
123795  2013-04-06 03:33:49 140
123796  2013-04-06 03:34:49 140
123797  2013-04-06 03:35:49 140
123798  2013-04-06 03:36:49 143
123799  2013-04-06 03:37:49 140
123800  2013-04-06 03:38:49 140
123801  2013-04-06 03:39:49 140

我目前正在使用下面的查询获取每小时平均值

I am currently getting hourly averages using the query below

SELECT DATE_FORMAT(x.time,'%Y-%m-%d %H:00:00')
     , avg(x.solids) avg_solids
  FROM solids x where time >= NOW() - INTERVAL 1 DAY
 GROUP 
    BY DATE_FORMAT(x.time,'%Y-%m-%d %H:00:00'); 

对于每个要在1个表格中显示的传感器(x3),我如何有效地结合(相对于时间)上面的查询结果

how can I efficiently join (with respect to time) the results of the query above for each sensor (x3) to be displayed in 1 table

==============================

===============================

下面的该查询获取每小时的值,但不确定如何对其进行周获取以获取每小时的平均值

this query below gets the hourly values, but not sure how to tweek it to get averages per hour

SELECT DATE_FORMAT(timeTable.minuteTime, '%Y-%m-%d %k:%i') time,
(oT2.temperature) temperature,
(T2.temperature) temp,
(S2.solids) solids,
(P2.Ph) Ph


FROM
(
    SELECT minuteTime.minuteTime minuteTime,
    ( SELECT MAX(time) FROM outside_temperature WHERE time <= minuteTime.minuteTime AND time >= NOW() - INTERVAL 1 DAY) otempTime, 
    ( SELECT MAX(time) FROM temperature1 WHERE time <= minuteTime.minuteTime AND time >= NOW() - INTERVAL 1 DAY) tempTime, 
    ( SELECT MAX(time) FROM Ph WHERE time <= minuteTime.minuteTime AND time >= NOW() - INTERVAL 1 DAY) phTime,  
    ( SELECT MAX(time) FROM solids WHERE time <= minuteTime.minuteTime AND time >= NOW() - INTERVAL 1 DAY) solidsTime

    FROM  
    (
        SELECT DATE(time) + INTERVAL (HOUR(time) DIV 1 *1 ) HOUR minuteTime
        FROM Ph
        WHERE time >= NOW() - INTERVAL 1 DAY AND time <= NOW()
        UNION SELECT DATE(time) + INTERVAL (HOUR(time) DIV 1 *1) HOUR
        FROM solids
        WHERE time >= NOW() - INTERVAL 1 DAY AND time <= NOW()
        UNION SELECT DATE(time) + INTERVAL (HOUR(time) DIV 1 *1) HOUR
        FROM outside_temperature
        WHERE time >= NOW() - INTERVAL 1 DAY AND time <= NOW()
        UNION SELECT DATE(time) + INTERVAL (HOUR(time) DIV 1 *1) HOUR
        FROM temperature1
        WHERE time >= NOW() - INTERVAL 1 DAY AND time <= NOW()
        GROUP BY 1
    ) minuteTime
) timeTable
LEFT JOIN outside_temperature oT2 ON oT2.time = timeTable.otempTime
LEFT JOIN temperature1 T2 ON T2.time = timeTable.tempTime
LEFT JOIN solids S2 ON S2.time = timeTable.solidsTime
LEFT JOIN Ph P2 ON P2.time = timeTable.phTime


GROUP BY DATE_FORMAT(timeTable.minuteTime, '%Y-%m-%d %k:%i') 
ORDER BY minuteTime ASC

推荐答案

Hour() seems that it would be a useful function for this, since you are only looking at a single day. Perhaps something like this would work for you:

SELECT * FROM
 (SELECT HOUR(time) hour, avg(ph) AS avg_ph
  FROM ph 
  WHERE time >= NOW() - INTERVAL 1 DAY
  GROUP BY hour) p
JOIN 
 (SELECT HOUR(time) hour, avg(temperature) AS avg_temp
  FROM temperature1 
  WHERE time >= NOW() - INTERVAL 1 DAY
  GROUP BY hour) t ON t.hour = p.hour
JOIN 
 (SELECT HOUR(time) hour, avg(solids) AS avg_solids
  FROM solids 
  WHERE time >= NOW() - INTERVAL 1 DAY
  GROUP BY hour) s ON s.hour = p.hour;

由于它正在使用内部联接,因此我假设一个小时内每个表中总是至少有一个记录,但这似乎是一个合理的假设.

Being that it is using inner joins, I'm making the assumption that there will always be at least one records in each table for the hour, but it seems like a reasonable assumption.

这篇关于mysql查询平均加入1个表中的3个查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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