Eu tenho a seguinte tabela em um banco de dados PostgreSQL
id | value_1 | value_2
-----------------------------
1 | 100 | 10
1 | NULL | 20
2 | 100 | 20
3 | 100 | 12
4 | 100 | 16
5 | NULL | 200
5 | 400 | 200
5 | 580 | 200
Gostaria de manter o registro com o valor máximo fornecido value_1
e remover todos os outros registros duplicados (tenha o mesmo id
) para que a consulta reduza a tabela para:
id | value_1 | value_2
-----------------------------
1 | 100 | 10
2 | 100 | 20
3 | 100 | 12
4 | 100 | 16
5 | 580 | 200
Isso pode ser feito facilmente usando o
distinct on ()
operador (proprietário) do PostgreSQL:Supondo:
DELETE
duplicar da tabela.id
é definidoNOT NULL
.value_1
por distintoid
.Um índice
(id)
ou mesmo(id, value_1)
seria útil neste caso. Relacionado:Após a limpeza, um
UNIQUE
índice(id)
o manteria assim. (Além de fazê-loNOT NULL
.)Se alguma das minhas suposições não se confirmar (seja mais específico!), uma solução diferente pode ser necessária.