2009-07-23 43 views
10

Tengo una tabla con algunas filas. Cada fila tiene un campo de fecha. En este momento, puede ser duplicados de una fecha. Necesito eliminar todos los duplicados y solo almacenar la fila con el id más alto. ¿Cómo es posible usar una consulta SQL?¿Cómo eliminar filas duplicadas con SQL?

Ahora:

date  id 
'07/07' 1 
'07/07' 2 
'07/07' 3 
'07/05' 4 
'07/05' 5 

lo que quiero:

date  id 
'07/07' 3 
'07/05' 5 
+0

¡A partir de los datos que ha enviado, termina con dos o tres filas! 07/05 se repite. – notnoop

Respuesta

33
DELETE FROM table WHERE id NOT IN 
    (SELECT MAX(id) FROM table GROUP BY date); 
+0

Guau, ¿fui por un camino indirecto o qué? Esta es definitivamente la mejor manera de hacer esto. – Eric

+0

Pensé que tu camino era demasiado complicado ... Pero sinceramente, quería hacerlo primero usando 3 consultas en lugar de solo esta. –

+4

Esta consulta también es útil para esta respuesta: SELECT fecha, COUNT (fecha) AS NumOccurrences de la Tabla GRUPO POR FECHA QUE TIENE (COUNT (fecha)> 1) – djangofan

2

para MySQL, PostgreSQL, Oracle mejor manera es auto JOIN.

Postgresql: 
DELETE FROM table t1 USING table t2 WHERE t1.date=t2.date AND t1.id<t2.id; 

MySQL   
DELETE FROM table 
USING table, table as vtable 
WHERE (table.id < vtable.id) 
AND (table.date=vtable.date) 

SQL agregada funciones (máximo, por grupo) casi siempre son muy lentos.

6

no tengo los derechos de comentarios, así que aquí está mi comentario como respuesta en caso de que alguien viene con el mismo problema:

En SQLite3, hay una clave implícita numérica primaria llamada "rowid", por lo que la misma la consulta se vería así:

DELETE FROM table WHERE rowid NOT IN 
(SELECT MAX(rowid) FROM table GROUP BY date); 

esto funcionará con cualquier tabla, incluso si no contiene una columna de clave principal llamada "id".

Cuestiones relacionadas