如何在SQLite中对messages表重复ID记录去重并保留最后条目
SQLite 查询保留相同ID的最后一条记录
你的messages表存在重复ID的记录,需要按插入顺序保留每个ID的最后一条,返回唯一ID的结果集。以下是几种可行的实现方式:
方法一:使用窗口函数(SQLite 3.25.0+ 支持)
利用ROW_NUMBER()窗口函数按ID分组,结合rowid(SQLite默认自增字段,对应插入顺序)倒序排序,取每组的第一条记录:
SELECT id, owner, content FROM ( SELECT id, owner, content, ROW_NUMBER() OVER (PARTITION BY id ORDER BY rowid DESC) AS rn FROM messages ) t WHERE rn = 1;
方法二:关联子查询(兼容低版本SQLite)
如果你的SQLite版本不支持窗口函数,可以通过子查询获取每个ID对应的最大rowid,再关联原表取出对应记录:
SELECT m.id, m.owner, m.content FROM messages m INNER JOIN ( SELECT id, MAX(rowid) AS max_rowid FROM messages GROUP BY id ) t ON m.id = t.id AND m.rowid = t.max_rowid;
特殊情况:表无rowid字段
如果你的表创建时指定了WITHOUT ROWID,需要先添加自增序列字段来记录插入顺序:
ALTER TABLE messages ADD COLUMN seq INTEGER PRIMARY KEY AUTOINCREMENT;
之后将上述SQL中的rowid替换为seq即可。
内容的提问来源于stack exchange,提问作者Joby Taffey
相关产品推荐
相关产品推荐

