【发布时间】:2017-05-29 13:23:00
【问题描述】:
我在 MySQL 中有一个表,其中包含温度传感器的一些数据。我每分钟有 1 行。我想执行一个查询,以了解是否有 1 小时的平均温度大于 4 度的跨度。我知道如何执行单行高于 4 的查询:
SELECT * FROM sensor WHERE t>4
但就我而言,我想知道是否有 1 小时的平均温度超过 4 度,而不仅仅是单行。
不知道如何编写这样的查询...
【问题讨论】:
我在 MySQL 中有一个表,其中包含温度传感器的一些数据。我每分钟有 1 行。我想执行一个查询,以了解是否有 1 小时的平均温度大于 4 度的跨度。我知道如何执行单行高于 4 的查询:
SELECT * FROM sensor WHERE t>4
但就我而言,我想知道是否有 1 小时的平均温度超过 4 度,而不仅仅是单行。
不知道如何编写这样的查询...
【问题讨论】:
一种方法是:
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 子句可以使用列别名进行过滤。
【讨论】:
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
【讨论】:
另一种方法是:
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;
【讨论】: