Sqlite 如何删除两列中具有重复值的所有行,但保留最后插入的行?

Sqlite 如何删除两列中具有重复值的所有行,但保留最后插入的行?,sqlite,Sqlite,鉴于下表: +----+--------+--------+------------+ | id | val1 | val2 | timestamp | +----+--------+--------+------------+ | 1 | 50 | 100 | 1471869500 | | 2 | 50 | 100 | 1471869800 | | 3 | 60 | 70 | 1471864400 | | 4 | 60 |

鉴于下表:

+----+--------+--------+------------+
| id | val1   | val2   | timestamp  |
+----+--------+--------+------------+
| 1  | 50     | 100    | 1471869500 |
| 2  | 50     | 100    | 1471869800 |
| 3  | 60     | 70     | 1471864400 |
| 4  | 60     | 80     | 1471863300 |
| 5  | 60     | 90     | 1471862200 |
| 6  | 60     | 100    | 1471861100 |
+----+--------+--------+------------+
我想删除列val1和val2中具有重复值的任何行,这样将是行1和2,但保留最后插入的行2。 在示例表中,仅删除第1行

我该如何创建一个SQLite语句来实现这一点

我试过:


Cheers

看来SQLite在其删除语法中不支持直接连接,但您仍然可以使用相关子查询来完成这项工作。请尝试以下查询:

DELETE
FROM yourTable
WHERE timestamp t <> (SELECT MAX(p.timestamp) FROM yourTable p
                      WHERE p.val1 = t.val1 AND p.val2 = t.val2)

我应该为我看到的其他行更改时间戳。当时间戳不同时,此查询无法正常工作。不过,对于这个示例来说,它确实非常有效:我将更新原始问题中的示例表。请访问sqlfiddle.com/!7/22503/1@GijsdeJong您误解了SQL小提琴。将“我的查询逻辑”应用于SELECT时,将返回确实要删除的记录。对于大多数数据,每个val1、val2组只有一条记录。在这种情况下,不会选择任何记录。在删除过程中,会发生相反的情况,选中的记录将被删除。是的,但是您能想出一个解决方案,按id删除行吗?我正在处理的实际数据包含更多的行,我不能确定按时间戳删除永远不会删除比我希望的更多的行。您的要求需要在查询中使用时间戳。如果要将删除限制为一系列ID,只需添加WHERE子句。感谢您的帮助: