2017-05-29 5 views
2

私は温度センサーのいくつかのデータでMySQLのテーブルを持っています。 1分に1行あります。私は平均温度が4度を超える1時間のスパンがあるかどうかを知るためにクエリを実行したいと思います。期間にわたるSQLクエリ

SELECT * FROM sensor WHERE t>4 

しかし、私の場合、私は平均気温が4を超えていた1時間の期間があったかどうかを知りたいだけでなく、単一:私は、単一の行が4を超えていたクエリを実行する方法を知っています行。

、このようなクエリを作成する方法がわからない...

答えて

1
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 
+0

ありがとう、私は15分(1時間ではなく)、または4時間など、スパンを得るためにどのように延長するのですか? –

3

一つの方法は次のとおりです。

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

EDIT:

Arggh。質問は、の平均温度がであり、温度はであり、温度はではありません(質問は非常に明確で、私はそれを誤読しています)。これはhaving句は、フィルタリングのために列の別名を使用することができますMySQLへの拡張を使用しています

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; 

:ここ

はそれを処理するためのバリエーションです。

+0

フラッシュGordoned再び –

1

別の方法は次のとおりです。

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; 
+0

おかげで、これは唯一の "完全な" 時間のために働くのだろうか?温度が14:30〜15:30の間で高すぎると動作しませんか、間違っていますか? –

関連する問題