2016-11-19 4 views
1

を重複を削除します。私は今、クリーニングに苦しんだ私はこのようなテーブルにデータを書き込み、OpenHABと呼ばれるホームオートメーションソフトウェア、使用している時間ベースのMySQLのテーブルに

http://sqlfiddle.com/#!9/5e35e4/1

+---------------------+-------+ 
| time    | value | 
+---------------------+-------+ 
| 2016-10-31 22:00:00 | 11.1 | 
| 2016-10-31 22:07:08 | 10.8 | 
| 2016-10-31 22:20:02 | 10.8 | 
| 2016-10-31 22:30:28 | 10.8 | 
| 2016-10-31 22:39:29 | 10.8 | 
| 2016-10-31 22:44:04 | 10.8 | 
| 2016-10-31 22:49:02 | 10.5 | 
| 2016-10-31 23:00:00 | 10.5 | 
| 2016-10-31 23:42:02 | 10 | 
| 2016-11-01 00:00:00 | 10 | 
| 2016-11-01 00:30:02 | 9.5 | 
| 2016-11-01 01:00:00 | 9.5 | 
| 2016-11-01 01:11:02 | 9.3 | 
| 2016-11-01 01:22:02 | 9.1 | 

をOpenHABを使い始めた時から重複している(100k +)ので、これらの値を上げてしまい、ロギングシステムを適切にセットアップしていないからです。

複数の連続する行で値が変更されなかった場合(最初の行と最後の行を除くすべての行を削除する必要があります)。上記の例を考えると、最適な出力は次のようになります。私が正しくあなたの質問を理解して

+---------------------+-------+ 
| time    | value | 
+---------------------+-------+ 
| 2016-10-31 22:00:00 | 11.1 | 
| 2016-10-31 22:07:08 | 10.8 | <-- only here 
| 2016-10-31 22:44:04 | 10.8 | 
| 2016-10-31 22:49:02 | 10.5 | 
| 2016-10-31 23:00:00 | 10.5 | 
| 2016-10-31 23:42:02 | 10 | 
| 2016-11-01 00:00:00 | 10 | 
| 2016-11-01 00:30:02 | 9.5 | 
| 2016-11-01 01:00:00 | 9.5 | 
| 2016-11-01 01:11:02 | 9.3 | 
| 2016-11-01 01:22:02 | 9.1 | 

答えて

0

場合は、重複した場合にのみ、最初と最後の値に興味を持っています。

私は、このクエリは値によってグループ化した後、指定した値をMAXまたはMIN時間ではありませんすべてを省略することにより、トリックを行うべきだと思う:

DELETE FROM Item67 
WHERE time NOT IN (SELECT max(time) FROM item67 GROUP BY value) 
AND time NOT IN (SELECT min(time) FROM item67 GROUP BY value); 
+0

あなたのクエリはテーブル全体での最小/最大値を削除します。例えば、これらのエントリを削除します:9 9 10 ** 10 ** ** 10 ** ** 10 ** 8 7 ** 10 ** 10 –

+0

うーん...私が提案したクエリ。私はそれを取るこれはあなたが望んでいないものですか?私はフィドルにリンクします... –

+0

[結果の謎解き](http://sqlfiddle.com/#!9/a55f90) –

0

私は一つの可能​​なクエリを得たと思います。それが正常に動作するかどうかは、まだ評価しています:

http://sqlfiddle.com/#!9/5e35e4/43

SELECT t1.time, t1.value 
FROM Item67 AS t1 
WHERE t1.value = (SELECT t2.value 
    FROM Item67 AS t2 
    WHERE t1.time > t2.time 
    ORDER BY t2.time 
    DESC LIMIT 1) 
and t1.value = (SELECT t3.value 
    FROM Item67 AS t3 
    WHERE t1.time < t3.time 
    ORDER BY t3.time 
    LIMIT 1 
); 
関連する問題