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

clj7thdc  于 2023-01-05  发布在  SQLite
关注(0)|答案(2)|浏览(143)

根据下表:

+----+--------+--------+------------+
| 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语句来为我做这件事?
我试过:
Select statement to find duplicates on certain fields
Delete all Duplicate Rows except for One in MySQL?
https://dba.stackexchange.com/questions/101697/sqlite3-remove-duplicates-by-multiple-columns
干杯

1bqhqjot

1bqhqjot1#

看起来SQLite在其DELETE语法中不支持直接连接,但您仍然可以使用相关子查询来完成工作。

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

brtdzjyr2#

如果我运行小提琴,大部分数据集都会被删除,只剩下id = 5。
我想删除val1和val2列中具有重复值的所有行(因此将是第1行和第2行),但保留最后插入的行(第2行)。在示例表中,只删除第1行。
这样就可以完成任务,只删除第1行:

SELECT * FROM queue
WHERE rowid NOT IN (
  SELECT MAX(rowid) 
  FROM queue 
  GROUP BY val1, val2
);

http://sqlfiddle.com/#!7/6cc1d/1

相关问题