Juste pour que je comprenne le problème.
Vous avez, si vous commandez l'ensemble de lignes basé sur l'horodatage, parfois dupliquer valeurs se produisant l'une à côté de l'autre, comme la paire de 1 ci-dessus dans le 2ème et 3rt article? et puis vous avez double 0 dans le 4ème et 5ème, c'est ça?
Et vous voulez le dernier de la paire correspondante (ou de la séquence s'il y en a plus de 2)?
Pourquoi devez-vous les supprimer? Je pose la question parce que, à moins qu'ils n'occupent une part importante de la taille de cette table, il pourrait être plus facile de les filtrer comme vous le faites séquentiellement lorsque vous devez les traiter ou les afficher.
Une solution, mais pas très bon, serait de récupérer l'horodatage minimum ci-dessus l'horodatage de la ligne en cours que vous examinez, puis récupérer la valeur de cela, et si elle est la même chose, don ne retourne pas la ligne actuelle.
Voici le SQL pour obtenir tout:
SELECT timestamp, value
FROM yourtable
Et voici comment joindre pour obtenir l'horodatage minimum au-dessus de l'actuel:
SELECT T1.timestamp, MIN(T2.timestamp) AS next_timestamp, T1.value
FROM yourtable T1, yourtable T2
WHERE T2.timestamp > T1.timestamp
GROUP BY T1.timestamp, T1.value
(je crains la requête ci-dessus sera horriblement lent)
Et puis de récupérer la valeur correspondant à cet horodatage minimum
SELECT T3.timestamp, T3.value
FROM (
SELECT T1.timestamp, MIN(T2.timestamp) AS next_timestamp, T1.value
FROM yourtable T1, yourtable T2
WHERE T2.timestamp > T1.timestamp
GROUP BY T1.timestamp, T1.value
) T3, yourtable AS T4
WHERE T3.next_timestamp = T4.timestamp
AND T3.value <> T4.value
Malheureusement, cela ne produit pas la dernière valeur, car il a besoin d'une valeur suivante pour comparer. Une simple valeur sentinelle factice (vous pouvez l'associer si vous en avez besoin) va gérer cela.
est ici la décharge de la base de données SQLite J'ai testé la requête ci-dessus contre:
BEGIN TRANSACTION;
CREATE TABLE yourtable (timestamp datetime, value int);
INSERT INTO "yourtable" VALUES('2008-09-22 16:28:14.133',0);
INSERT INTO "yourtable" VALUES('2008-09-22 16:28:35.233',1);
INSERT INTO "yourtable" VALUES('2008-09-22 16:29:16.353',1);
INSERT INTO "yourtable" VALUES('2008-09-22 16:31:37.273',0);
INSERT INTO "yourtable" VALUES('2008-09-22 16:35:43.134',0);
INSERT INTO "yourtable" VALUES('2008-09-22 16:36:39.633',1);
INSERT INTO "yourtable" VALUES('2008-09-22 16:41:40.733',0);
INSERT INTO "yourtable" VALUES('2099-12-31 23:59:59.999',2);
COMMIT;
Et voici le (formaté) Sortie:
timestamp value
2008-09-22 16:28:14.133 0
2008-09-22 16:29:16.353 1
2008-09-22 16:35:43.134 0
2008-09-22 16:36:39.633 1
2008-09-22 16:41:40.733 0
Comment savez-vous quelles sont les valeurs en double? Avez-vous une sorte de clé primaire sur la table? RIght maintenant je ne vois pas comment vous diriez quels deux enregistrements sont réalisés l'un à l'autre. – HLGEM