2010-09-12 40 views
9

Tengo una tabla que se parece a lo siguiente:SQL ¿Cómo eliminar duplicados dentro de la consulta de selección?

alt text

Como se ve, hay algunos duplicados fecha, por lo que la forma de seleccionar sólo una fila para cada fecha en esa mesa?

la columna 'id_from_other_table' es de INNER JOIN con la tabla anterior

+2

¿Qué base de datos y qué versión? – LittleBobbyTables

+0

Hola Tony, encontré esto útil cuando estaba tratando de hacer algo similar. No responde a su pregunta y eliminar los duplicados, pero ayuda a dar un recuento de lo que podría ser relevante: COUNT (*) - COUNT (nombre distinto) como 'nombre duplicado' – JPK

Respuesta

4

mencionas que hay duplicados fecha, pero parece que son bastante único a la precisión de segundos.

Puede aclarar qué precisión de la fecha en que se inicie la consideración fechas duplican - día, hora, minuto?

En cualquier caso, es probable que quieren floor your datetime field. No indicó qué campo es el preferido al eliminar duplicados, por lo que esta consulta preferirá el apellido en orden alfabético.

SELECT MAX(owner_name), 
     --floored to the second 
     dateadd(second,datediff(second,'2000-01-01',start_date),'2000-01-01') AS StartDate 
From MyTable 
GROUP BY dateadd(second,datediff(second,'2000-01-01',start_date),'2000-01-01') 
+0

considero año, mes, fecha y hh: mm: ss – Tony

4

¿Necesita cualquier otra información, excepto la fecha? Si no:

SELECT DISTINCT start_date FROM table; 
+2

Las fechas son las mismas, pero los tiempos son diferentes; como tal, 'DISTINCT' no funcionará en' start_date' sin algún formato – LittleBobbyTables

10

Hay varias filas con la misma fecha, pero la hora es diferente. Por lo tanto, DISTINCT start_date no funcionará. Lo que necesita es: enviar el fecha_inicial a una fecha (por lo que la pieza del tiempo se ha ido), y luego hacer un DISTINCT:

SELECT DISTINCT CAST(start_date AS DATE) FROM table; 

Dependiendo de qué base de datos que utilice, el nombre del tipo de FECHA es diferente.

1
Select Distinct CAST(FLOOR(CAST(start_date AS FLOAT))AS DATETIME) from Table 
0

Si desea seleccionar cualquier fila única al azar para determinado día, entonces

SELECT * FROM table_name GROUP BY DAY(start_date) 

Si desea seleccionar una sola entrada para cada usuario por día, entonces

SELECT * FROM table_name GROUP BY DAY(start_date),owner_name 
1

aquí está la solución para su búsqueda devolver sólo una fila para cada fecha de esa tabla aquí en la solución 'Tony' se producirá el doble de dos diferentes fechas de inicio están ahí para que

SELECT * FROM 
(
    SELECT T1.*, ROW_NUMBER() OVER(PARTITION BY TRUNC(START_DATE),OWNER_NAME ORDER BY 1,2 DESC) RNM 
    FROM TABLE T1 
) 
WHERE RNM=1 
+0

hi @zessx cómo se editó, puse el código con formato que ha editado, pero después de publicar, no apareció como está ahora, ¿cómo lo haces? –

+1

Pegar el código formateado no es suficiente (de hecho, no hace nada). Debe pegar el código, seleccionarlo y usar 'Ctrl + K' (o hacer clic en el botón' {} 'en el editor StackOverflow).También puede hacerlo manualmente, agregando 4 espacios antes de cada línea de su código. – zessx

0

Hay que convertir el "DateTime" a una "fecha". Entonces puede seleccionar más fácilmente solo uno para la fecha determinada sin importar la hora de esa fecha.

Cuestiones relacionadas