Просто чтобы я понял проблему.
Если вы упорядочиваете набор строк на основе метки времени, иногда повторяются значения, встречающиеся рядом друг с другом, как, например, приведенная выше пара 1 в элементе 2nd и 3rt? а потом у вас двойные 0 в 4-м и 5-м, это так?
А вы хотите последнюю из соответствующей пары (или последовательности, если их больше 2)?
Зачем вам их удалять? Я спрашиваю, потому что, если они не занимают значительную долю размера этой таблицы, может быть легче отфильтровать их, как вы последовательно, когда вам нужно обработать или отобразить их.
Решение, хотя и не очень хорошее, было бы получить минимальную временную метку выше временной метки текущей строки, которую вы исследуете, а затем извлечь значение из нее, и если это то же самое, не возвращать текущую строку.
Вот SQL, чтобы получить все:
SELECT timestamp, value
FROM yourtable
А вот как присоединиться, чтобы получить минимальную метку времени выше текущей:
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
(Боюсь, что приведенный выше запрос будет ужасно медленным)
И затем извлечь значение, соответствующее этой минимальной временной отметке
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
К сожалению, это не дает последнего значения, так как для сравнения необходимо следующее значение. Простое фиктивное значение Sentinel (вы можете объединить это, если вам нужно) будет обрабатывать это.
Вот дамп базы данных sqlite, с которым я проверял вышеуказанный запрос:
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;
А вот (форматированный) вывод:
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