【问题标题】:mysql query to join 3 queries in 1 table while averagingmysql查询在平均时加入1个表中的3个查询
【发布时间】:2013-04-05 16:56:07
【问题描述】:

我有 3 个非常大的表,每分钟记录一次值, 以下是这些表格的摘录

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

表 PH(仅提取,此表非常大,包含超过 130,000 个值)

    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 个值)

    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 个值)

    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

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

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'); 

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

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

下面的这个查询获取每小时的值,但不确定如何调整它以获得每小时的平均值

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

【问题讨论】:

  • 没有必要为分组做 date_format 的东西。 GROUP BY DATE(x.time) 将完成同样的事情,而无需强制 mysql 进行一堆重复的字符串格式化,无论如何都会被丢弃。
  • 您需要每小时或每天(或两者)的平均值吗?还是您需要每小时平均数,然后每天平均每小时平均数?
  • 我只需要每小时的平均值,但只需要在表格上显示 1 天的平均值
  • 标记,按日期分组(x.time)没有得到所有~24个结果,我只得到2个结果。这可能是由于值之间的第二次延迟!
  • 考虑提供 DDL(或 SQLFIDDLE)以及所需的结果集。

标签: mysql join average


【解决方案1】:

Hour() 似乎对此很有用,因为您只查看一天。也许这样的事情对你有用:

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;

由于它使用的是内部连接,我假设每个表一小时内总是至少有一条记录,但这似乎是一个合理的假设。

【讨论】:

  • 谢谢,您的表格有效,但由于我会将结果表格推送到图表功能,因此时间需要以日期时间格式显示,而且查询表格上的时间从 0 开始并完成例如,在 23 点,如果当前时间是凌晨 5 点,我希望查询拉动,即昨天早上 5 点到今天凌晨 5 点,而不是早上 0 点到下午 23 点。如果你知道我的意思。
  • 我愿意,昨天早上 6 点到今天早上 5 点应该很实用。昨天凌晨 5 点和今天凌晨 5 点重叠将是一个问题。如果是我,我会调整 WHERE 子句以仅处理整个小时。如果我正在分析数据并收到 23 组每小时统计数据,按两个半小时预订,我肯定会扔掉半小时。至于格式化时间,只需从任何子查询中提取 MIN(time) 或其他内容,您就可以开始比赛了。
  • 作为一个菜鸟,谁能帮忙,我对时间的形成及其顺序特别感兴趣
  • 我刚刚在上面插入的查询,根据需要获取每小时值,但我不知道如何调整它来做每小时平均值
  • 我做到了,我只是插入:SELECT p.time,........ORDER BY p.time ASC。但现在我想知道如何在不重叠的情况下获得 2 天的数据。目前,如果我选择 2 天,则查询平均 2 天并在 1 天显示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2023-03-05
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多