Eu tenho uma tabela em um banco de dados PostgreSQL 8.3.8, que não possui chaves / restrições e possui várias linhas com exatamente os mesmos valores.
Eu gostaria de remover todas as duplicatas e manter apenas 1 cópia de cada linha.
Há uma coluna em particular (chamada "chave") que pode ser usada para identificar duplicatas (ou seja, deve haver apenas uma entrada para cada "chave" distinta).
Como posso fazer isso? (de preferência com um único comando SQL) A velocidade não é um problema neste caso (existem apenas algumas linhas).
sql
postgresql
duplicates
André Morujão
fonte
fonte
Uma solução mais rápida é
fonte
ctid
?Isso é rápido e conciso:
Veja também minha resposta em Como excluir linhas duplicadas sem identificador exclusivo, que inclui mais informações.
fonte
ctid
aponta para a localização física do registro na tabela. Ao contrário do que escrevi no momento no comentário, usar o operador menos que não aponta necessariamente para a versão mais antiga, pois o ct pode ser agrupado e um valor com um ctid inferior pode realmente ser mais recente.min(ctid)
? enquanto o seu está mantendo os mais novos? obrigado!Eu tentei isso:
fornecido pelo wiki Postgres:
https://wiki.postgresql.org/wiki/Deleting_duplicates
fonte
id
incluídas.id
onde coluna1 ... 3 são duplicadosTive que criar minha própria versão. A versão escrita por @a_horse_with_no_name é muito lenta na minha tabela (21 milhões de linhas). E @rapimo simplesmente não exclui cópias.
Aqui está o que eu uso no PostgreSQL 9.5
fonte
Eu usaria uma mesa temporária:
Em seguida, exclua
tab
e renomeietab_temp
paratab
.fonte
DROP TABLE IF EXISTS tmp; CREATE TABLE tmp as ( SELECT * from (SELECT DISTINCT * FROM your_table) as t ); DELETE from your_table; INSERT INTO your_table SELECT * from tmp; DROP TABLE tmp;
Outra abordagem (funciona apenas se você tiver qualquer campo único como
id
em sua tabela) para encontrar todos os ids únicos por colunas e remover outros ids que não estão na lista únicafonte
E se:
Eu estava preocupado com a ordem de execução, se DELETE aconteceria antes de SELECT DISTINCT, mas funciona bem para mim. E tem a vantagem adicional de não precisar de nenhum conhecimento sobre a estrutura da tabela.
fonte
json
), isso não funcionará.Isto funcionou bem para mim. Eu tinha uma tabela de termos que continha valores duplicados. Executou uma consulta para preencher uma tabela temporária com todas as linhas duplicadas. Em seguida, executei a instrução a delete com esses ids na tabela temporária. valor é a coluna que continha as duplicatas.
fonte
Aqui está uma solução usando
PARTITION BY
:fonte