我在MySQL中有一个表格,里面有一些温度传感器的数据。我每分钟有一排。我想进行一次查询,以了解平均温度大于4度时是否有1小时的任何跨度。我知道如何执行一个查询,其中一个单行高于4:一段时间内的SQL查询
SELECT * FROM sensor WHERE t>4
但在我的情况,我想知道是否有1小时的时间,其中平均气温超过40,而不是只有一个行。
不知道怎么写这样的查询...
我在MySQL中有一个表格,里面有一些温度传感器的数据。我每分钟有一排。我想进行一次查询,以了解平均温度大于4度时是否有1小时的任何跨度。我知道如何执行一个查询,其中一个单行高于4:一段时间内的SQL查询
SELECT * FROM sensor WHERE t>4
但在我的情况,我想知道是否有1小时的时间,其中平均气温超过40,而不是只有一个行。
不知道怎么写这样的查询...
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 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
);
编辑:
Arggh。这个问题问的温度,而不是任何温度(这个问题很清楚,我只是误读它)平均。
这里是处理的变化:
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
子句可以利用列别名的用于过滤。
闪存Gordoned再次 –
另一种方法是:
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之间的温度过高时,它不会工作,或者我错了吗? –
谢谢,我该如何扩展它以获得每15分钟(而不是1小时)的跨度,或4小时等? –