traer solo repetir repetidos registros mostrar menos evitar eliminar duplicados dejando consulta agrupar sql sql-delete

sql - solo - Eliminar todo menos un registro duplicado



sql eliminar registros repetidos dejando solo 1 (4)

Aquí está la solución de Frank Schmitt con una pequeña solución para la tabla temporal:

delete from `my_tab` where id not in ( SELECT * FROM (select min(id) from `my_tab` group by profile_id, visitor_id) AS temp_tab )

Tengo una tabla que se supone que debe mantener un seguimiento de los visitantes a un perfil determinado (ID de usuario a par de ID de usuario). Resulta que mi consulta SQL estaba un poco apagada y está produciendo varios pares en lugar de uno solo como estaba previsto. En retrospectiva, debería haber aplicado una restricción única en cada par de id + id.

Ahora, ¿cómo podría ir sobre la limpieza de la mesa? Lo que quiero hacer es eliminar todos los pares duplicados y dejar solo uno.

Así que por ejemplo cambia esto:

23515 -> 52525 date_visited 23515 -> 52525 date_visited 23515 -> 52525 date_visited 12345 -> 54321 date_visited 12345 -> 54321 date_visited 12345 -> 54321 date_visited 12345 -> 54321 date_visited 23515 -> 52525 date_visited ...

Dentro de esto:

23515 -> 52525 date_visited 12345 -> 54321 date_visited

Actualización: Aquí está la estructura de la tabla según lo solicitado:

id int(10) UNSIGNED Non Aucun AUTO_INCREMENT profile_id int(10) UNSIGNED Non 0 visitor_id int(10) UNSIGNED Non 0 date_visited timestamp Non CURRENT_TIMESTAMP


Esto funcionará:

With NewCTE AS ( Select *, Row_number() over(partition by ID order by ID)as RowNumber from table_name ) Delete from NewCTE where RowNumber > 1


Seleccionar todas las filas únicas
Cópialos en una nueva tabla temporal.
Mesa original truncada
Copie los datos de la tabla temporal a la tabla original

Eso es lo que yo haría. No estoy seguro si hay 1 consulta que haría todo esto por ti.


Use group by en una subconsulta:

delete from my_tab where id not in (select min(id) from my_tab group by profile_id, visitor_id);

Necesitas algún tipo de identificador único (aquí, estoy usando id).

ACTUALIZAR

Como lo señaló @JamesPoulson, esto causa un error de sintaxis en MySQL; La solución correcta es (como se muestra en la respuesta de James ):

delete from `my_tab` where id not in ( SELECT * FROM (select min(id) from `my_tab` group by profile_id, visitor_id) AS temp_tab );