【问题标题】:SQL query over period of time一段时间内的 SQL 查询
【发布时间】:2017-05-29 13:23:00
【问题描述】:

我在 MySQL 中有一个表,其中包含温度传感器的一些数据。我每分钟有 1 行。我想执行一个查询,以了解是否有 1 小时的平均温度大于 4 度的跨度。我知道如何执行单行高于 4 的查询:

SELECT * FROM sensor WHERE t>4

但就我而言,我想知道是否有 1 小时的平均温度超过 4 度,而不仅仅是单行。

不知道如何编写这样的查询...

【问题讨论】:

    标签: mysql sql average


    【解决方案1】:

    一种方法是:

    select s.*
    from sensor s
    where t > 4 and
          not exists (select 1
                      from sensor s2
                      where s2.datetime >= s.datetime and
                            s2.datetime < s.datetime + interval 1 hour and
                            s2.t <= 4
                     );
    

    编辑:

    啊。该问题询问的是平均温度,而不是任何温度(问题很清楚,我只是看错了)。

    这里有一个变体来处理这个问题:

    select s.*,
           (select avg(s2.t)
            from sensor s2
            where s2.datetime >= s.datetime and
                  s2.datetime < s.datetime + interval 1 hour 
           ) as avg_t
    from t
    having avg_t > 4;
    

    这使用了 MySQL 的扩展,其中 having 子句可以使用列别名进行过滤。

    【讨论】:

      【解决方案2】:
      SELECT DATE_FORMAT(DATE_TIME_FIELD, '%Y-%m-%d %H') AS DATE_TIME_HOUR
      FROM sensor
      GROUP BY DATE_FORMAT(DATE_TIME_FIELD, '%Y-%m-%d %H')
      HAVING AVG(T)>4
      

      【讨论】:

      • 谢谢,我如何扩展它以获得每 15 分钟(而不是 1 小时)或 4 小时等的跨度?
      【解决方案3】:

      另一种方法是:

      SELECT *, 
          AVG(`t`) AS `avg_t`, 
          DATE_FORMAT(`date`, '%Y-%m-%d %H') AS `date_and_hour`
      FROM `sensor`
      GROUP BY DATE_FORMAT(`date`, '%Y-%m-%d %H')
      HAVING `avg_t` > 4;
      

      【讨论】:

      • 谢谢,但这只适用于“完整”小时?例如,当 14:30-15:30 之间的温度过高时,它不会起作用,还是我错了?
      猜你喜欢
      • 2014-09-07
      • 1970-01-01
      • 2012-11-25
      • 2011-03-30
      • 2021-05-31
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2015-02-16
      相关资源
      最近更新 更多