2016-11-19 4 views
1

J'utilise un logiciel domotique appelé OpenHAB, qui écrit des données dans une table comme ceci:Supprimer les doublons dans les tables MySQL basées sur le temps

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 | 

Je suis maintenant aux prises avec le nettoyage ces valeurs, car il y a beaucoup de doublons (100k +) à partir du moment où j'ai commencé à utiliser OpenHAB et que je n'ai pas configuré correctement le système de journalisation.

Si la valeur (peut être de type double ou varchar) n'a pas changé dans plusieurs lignes consécutives, chaque ligne à l'exception du premier et du dernier doit être supprimée. Compte tenu de l'exemple ci-dessus, la sortie optimale ressemblerait à ceci:

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

Répondre

0

Si je comprends bien votre question, vous êtes intéressé seulement dans les première et dernière en cas de doublons.

Je pense que cette requête devrait faire l'affaire, en omettant tout ce qui est pas le temps MAX ou MIN pour une valeur donnée après regroupement par valeur:

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

Votre requête supprime les valeurs min/max dans la table. Par exemple il supprimerait ces entrées: 9 9 10 ** 10 ** ** 10 ** ** 10 ** 8 7 ** 10 ** 10 –

+0

Hmm ... voici à quoi ressemble la table que vous avez postée après la requête que j'ai suggérée . Je suppose que ce n'est pas ce que tu voulais? Je lierai à un violon ... –

+0

[Fiddle des résultats ici] (http://sqlfiddle.com/#!9/a55f90) –

0

Je pense que je suis une requête possible. J'évalue toujours si cela fonctionne correctement:

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