Antes de escrever as consultas, resolvi analisar, investigar e executar.
Entendendo o Desafio
- Tentei entender o que poderia causar esses erros, mas vi que isso não me ajudaria pois existem milhões de possibilidades.
- Entendi que aqueles dados eram reais e precisavam ser preservados para futuras análises.
- Percebi que o nome dos produtos se repetiam porém com IDs diferentes.
Estratégias Avaliadas
- Deletar os dados: Inviável, pois os dados eram reais e apenas o preço estava inconsistente.
- Coluna "Erro" (true/false): Essa solução eu juro que repensei e martelei, porém ficaria difícil de gerenciar e manter à longo prazo, como também não me protegeria de futuras inconsistências.
- Criar tabela de intervalos: Estratégia escolhida!
Análises Realizadas
Total de erros: 7.641 registros
Produto com mais erros:
- Chocolate: 1.968 erros
- Bola de Futebol: 1.921 erros
- Livro de Ficção: 1.844 erros
- Camisa: 1.768 erros
Tipo de erro:
- Abaixo do mínimo: 140 registros
- Acima do máximo: 7.501 registros
Conclusão da Análise
Percebi que a maior quantidade de erros era com produtos acima do valor máximo. Talvez o que pode ter ocasionado isso foi a pessoa que registrou talvez confundiu a coluna de preço, podendo assim ter adicionado o valor unitário vezes x quantidades desse produto. Foram 7.641 registros com erros, isso é 76,41% da tabela de produtos que possui 10.000 registros.
Criando a tabela preco_min_max_produtos eu evito que novos dados entrem com valores inconsistentes e preservo a integridade desses dados.
Implementação
Criação da Tabela:
CREATE TABLE preco_min_max_produtos (
nome_produto TEXT PRIMARY KEY,
preco_min REAL NOT NULL,
preco_max REAL NOT NULL
);
Estratégia: Se preço < mínimo → ajusta pro mínimo. Se preço > máximo → ajusta pro máximo.
Correção com UPDATE:
UPDATE produtos
SET preco = (
SELECT preco_min
FROM preco_min_max_produtos
WHERE preco_min_max_produtos.nome_produto = produtos.nome_produto
)
WHERE EXISTS (
SELECT 1
FROM preco_min_max_produtos
WHERE preco_min_max_produtos.nome_produto = produtos.nome_produto
AND produtos.preco < preco_min_max_produtos.preco_min
);
Resultado: 0 registros com erro
Desafio Encontrado
Inicialmente pensei em usar FK com id_produto, mas percebi que os produtos se repetiam com IDs diferentes. A regra era por TIPO de produto. Usei nome_produto (TEXT) como chave.
Aprendizados
- EXISTS em SQL
- UPDATE com subqueries
- Integridade de dados