Как удалить дубликаты строк в 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