Voltar ao código SQL

Encontrar clientes duplicados y quedarse con el más reciente

Una función de ventana numera los registros repetidos; los que quedan con puesto mayor a uno son los que sobran.

Este post ainda não está no seu idioma; você o vê em espanhol. O código é o mesmo.

O problema

La tabla de clientes tiene el mismo correo cargado varias veces, con mayúsculas y espacios distintos. Hay que saber cuáles sobran antes de borrar nada.

SQL
-- Clientes repetidos por correo: quedarse con el registro más reciente.
WITH ordenados AS (
  SELECT id, correo, nombre, actualizado_en,
         ROW_NUMBER() OVER (
           PARTITION BY LOWER(TRIM(correo))
           ORDER BY actualizado_en DESC, id DESC
         ) AS puesto
  FROM clientes
)
SELECT id, correo, nombre, actualizado_en
FROM ordenados
WHERE puesto > 1          -- estos son los que sobran
ORDER BY correo;

-- Cuando el SELECT muestre lo esperado, el borrado es el mismo criterio:
-- DELETE FROM clientes WHERE id IN (SELECT id FROM ordenados WHERE puesto > 1);

Por que está escrito assim

  1. PARTITION BY arma un grupo por cada correo normalizado: sin mayúsculas y sin espacios alrededor.
  2. ROW_NUMBER numera dentro de cada grupo empezando por el más reciente; el puesto 1 es el que se queda.
  3. El desempate por id evita que dos registros con la misma fecha salgan en orden distinto cada vez.
  4. Primero el SELECT, después el DELETE: el mismo criterio, mirado antes de ejecutarlo.
Como testar

Funciona en PostgreSQL, MySQL 8, SQL Server y SQLite 3.25 o superior. Corré primero solo el SELECT sobre una copia de la tabla.

Atenção

Borrar el duplicado deja huérfanos sus pedidos, facturas o lo que apunte a ese id. Antes del DELETE hay que reasignar esas referencias al registro que se queda.

Adapte ao seu caso com IA

O botão copia este prompt com o código colado abaixo. Substitua os colchetes pelo que é seu e cole no ChatGPT, Claude, Gemini ou Copilot.

O prompt
Tengo esta consulta SQL que detecta clientes duplicados por correo. Mi motor es [MOTOR Y VERSIÓN]. Extendela para que antes de borrar reasigne al registro que se queda las filas de estas tablas que apuntan al duplicado: [TABLAS Y COLUMNAS]. Todo dentro de una transacción, con un SELECT de control antes y después. El criterio de duplicado es: [CRITERIO].

Exemplo escrito e revisado à mão.

Compartilhar

Comentários

Ainda não há comentários. O primeiro pode ser o seu.

Apenas texto, sem links. Não pedimos e-mail. Os comentários são revisados antes de serem publicados.

Adaptou para algo seu?

Me conte o que resolveu com isto, ou o que faltou.

Continue testando

Mais código

Ver todos
Darinel Ortega Online · respondo ao longo do dia
Hoje
Olá. Aqui eu não vendo nada: isto é para trocar conhecimento sobre tecnologia.
Escreva o que quiser — pode mandar texto, imagens ou documentos. As mensagens chegam ao meu console e eu respondo por lá.
Você está escrevendo fora do horário. Eu leio assim que o dia começar.

Conversa aberta para compartilhar conhecimento. As mensagens chegam ao meu console e eu respondo por lá.

Vamos marcar uma conversa

Escolha o dia e a hora que funcionem para você. Trinta minutos, sem discurso comercial.

Videochamada

Para uma videochamada, peça por aqui que eu te mando o link da sessão.