如何在sqlite中删除包含ID的每个列都是重复的重复行?

时间:2018-03-01 16:31:12

标签: sql sqlite

我正在使用sqlite。我正在导入一个数据集,其中ID被外部分配到临时表中,然后将其插入到我的永久表中。永久表使用外部标识(RunId)并且没有其他标识列。

我将表从csv导入到新表Book1中,其中C15是ID列。然后我运行插入:

INSERT INTO PrimusRuns (RunId, TransientName, RunDateStart, RunType, TestDateStart,
                    Gross, CPS, Shares, MaxExposure, PercentWin, Duration)
SELECT a.C15, a.C1, JULIANDAY(a.C2), a.C3,JULIANDAY(a.C4),
        a.C6, a.C8, a.C9, a.C10, a.C11, a.C14
FROM Book1 as a;

但是我得到了主键约束错误:

[19] [SQLITE_CONSTRAINT_PRIMARYKEY] A PRIMARY KEY constraint failed (UNIQUE constraint failed: PrimusRuns.RunID)

首先我认为其中一些行已经在表格中但是正在运行:

SELECT * FROM Book1 WHERE C15 IN(
  SELECT RunID from PrimusRuns
);

什么都不返回。

然后我意识到在我运行时导入中有重复的行:

SELECT * FROM Book1 GROUP BY C15 HAVING COUNT(*) > 1

这个聚合查询返回95行,这意味着我必须删除至少95行。如何删除告诉它删除重复项?

注意:还有其他类似的问题,但我的问题不同,因为id也是重复的。其他问题将列的其余部分分组并删除max(id)。但在我的情况下,max id返回的行不仅仅是一行。

1 个答案:

答案 0 :(得分:1)

对于仅在删除重复行到C15时的相关内容,您可以通过C15找到所有min(id)组..所以这是每个C15值的单行 并删除其他例如

  delete from 
  book1
  where id not in ( 
  select min(id)
  from Book1
  group by C15) 

但是如果你有完整的完全重复的行,你可以在这些步骤中使用..

1)您可以创建一个临时表,其中包含重复的不同结果,例如:

create table my_temp_distinct  as  
select col1, col2 ... 
from Book1
group by col1, col2, ... 
having count(*)> 1

2)然后删除所有带有重复行的行

  delete from 
  book1
  where id in ( 
  select min(id)
  from Book1
  group by C15) 

3)并使用select形成最后一次插入停放的行

insert into Book1 (col1, col2 ....)
select col1, col2, ...
from my_temp_distinct