Как удалить дубликаты строк в sqlite, где каждый столбец с идентификатором дублируется?

Я использую sqlite. Я импортирую набор данных, в котором идентификатор назначен извне, во временную таблицу, прежде чем вставить их в свою постоянную таблицу. Постоянная таблица использует внешний идентификатор (RunId) и не имеет другого столбца идентификатора.

Я импортирую таблицу из csv в новую таблицу Book1, где C15 - столбец идентификатора. Затем я запускаю вставку:

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 возвращает обе строки, а не только одну.

1 ответ

Решение

Для того, что относится только к удалению дублированной строки, ссылающейся на C15, вы можете найти всю группу min(id) по C15 .. так что это единственная строка для каждого значения 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) и последняя вставка с помощью выбора формы припаркованных строк

insert into Book1 (col1, col2 ....)
select col1, col2, ...
from my_temp_distinct
Другие вопросы по тегам