Answers:
您需要一种区分行的方法。根据您的评论,您可以为此使用特殊的rowid列。
要通过保持最低的删除重复rowid
每(hash,d)
:
delete from YourTable
where rowid not in
(
select min(rowid)
from YourTable
group by
hash
, d
)
sqlite> alter table dist add id integer primary key autoincrement; Error: Cannot add a PRIMARY KEY column
autoincrement
但是,您需要的零件是零件,如果省略primary key
零件,它是否可以工作?
sqlite> alter table dist add id integer autoincrement;
Error: near "autoincrement": syntax error
编辑:SQLite确实有一个“ rowid”伪列类型thing,它会自动存在,我可以使用它吗?
delete from dist where rowid not in (select max(rowid) from dist group by hash);
似乎能解决问题!谢谢。
如果添加主键不是一种选择,那么一种方法是将重复的DISTINCT存储在临时表中,从现有表中删除所有重复的记录,然后将记录从临时表中添加回原始表中。
例如(为SQL Server 2008编写的,但是该技术对于任何数据库都是相同的):
DECLARE @original AS TABLE([hash] varchar(20), [d] float)
INSERT INTO @original VALUES('A', 1)
INSERT INTO @original VALUES('A', 2)
INSERT INTO @original VALUES('A', 1)
INSERT INTO @original VALUES('B', 1)
INSERT INTO @original VALUES('C', 1)
INSERT INTO @original VALUES('C', 1)
DECLARE @temp AS TABLE([hash] varchar(20), [d] float)
INSERT INTO @temp
SELECT [hash], [d] FROM @original
GROUP BY [hash], [d]
HAVING COUNT(*) > 1
DELETE O
FROM @original O
JOIN @temp T ON T.[hash] = O.[hash] AND T.[d] = O.[d]
INSERT INTO @original
SELECT [hash], [d] FROM @temp
SELECT * FROM @original
我不确定sqlite是否具有ROW_NUMBER()
类型函数,但是如果这样做,您还可以尝试此处列出的一些方法:从SQL表中删除没有主键的重复记录
delete <alias> from <table> <alias>
语法