只是为了让我理解这个问题。
如果您根据时间戳对行集进行排序,有时会出现相邻的重复值,例如上述第 2 项和第 3 项中的一对 1?然后你在第 4 和第 5 有双 0,是这样吗?
并且您想要对应对中的最后一个(或序列,如果有超过 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
不幸的是,这不会产生最后一个值,因为它需要一个后续值来比较。一个简单的虚拟哨兵值(如果需要,您可以将其合并)将处理该问题。
这是我测试上述查询的 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