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.
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.
-- 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
- PARTITION BY arma un grupo por cada correo normalizado: sin mayúsculas y sin espacios alrededor.
- ROW_NUMBER numera dentro de cada grupo empezando por el más reciente; el puesto 1 es el que se queda.
- El desempate por id evita que dos registros con la misma fecha salgan en orden distinto cada vez.
- Primero el SELECT, después el DELETE: el mismo criterio, mirado antes de ejecutarlo.
Funciona en PostgreSQL, MySQL 8, SQL Server y SQLite 3.25 o superior. Corré primero solo el SELECT sobre una copia de la tabla.
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.
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.
Comentários
Ainda não há comentários. O primeiro pode ser o seu.
Adaptou para algo seu?
Me conte o que resolveu com isto, ou o que faltou.