2009-09-18 24 views
6

Tengo un TempTable que tiene este aspecto:¿Cómo devolver solo una fila si hay varias filas duplicadas y aún así devolver las filas que no son duplicadas?

RequestID | CreatedDate   | HistoryStatus   
CF-0000001 | 8/26/2009 1:07:01 PM | For Review 
CF-0000001 | 8/26/2009 1:07:01 PM | Completed 
CF-0000112 | 8/26/2009 1:07:01 PM | For Review 
CF-0000113 | 8/26/2009 1:07:01 PM | For Review 
CF-0000114 | 8/26/2009 1:07:01 PM | Completed 
CF-0000115 | 8/26/2009 1:07:01 PM | Completed 

Y cómo me gustaría la mesa para mirar al final es la siguiente:

RequestID | CreatedDate   | HistoryStatus   
CF-0000001 | 8/26/2009 1:07:01 PM | Completed 
CF-0000112 | 8/26/2009 1:07:01 PM | For Review 
CF-0000113 | 8/26/2009 1:07:01 PM | For Review 
CF-0000114 | 8/26/2009 1:07:01 PM | Completed 
CF-0000115 | 8/26/2009 1:07:01 PM | Completed 

es decir, el duplicado CF-0000001 debe eliminarse.

¿Cómo puedo devolver o debería decir elegir solo UNA fila si hay múltiples filas duplicadas y todavía devolver las filas que no son duplicados?

+6

Ambas tablas son las mismas. Por favor, corrija el resultado esperado. – shahkalpesh

+0

Devuelve duplicados en ** ¿QUÉ **? MySQL SQL? Oracle SQL? CouchDB? Cassandra? MS SQL Server? Una lista en Haskell? ¿Un SQuery para-comprensión en Scala? Un archivo de texto en Perl? Chico, podría seguir ... –

+1

¿Qué fila se devolverá si RequestID y CreatedDate son los mismos? ¿O no importa? – eksortso

Respuesta

0

Si se trata de una cuestión de SQL, y entiendo lo que están pidiendo, (que no es del todo claro), sólo tiene que añadir distinta a la consulta

Select Distinct * From TempTable 
+1

Eso no ayudará a Chebu , porque los valores en HistoryStatus son diferentes. – eksortso

4
select t.* 
from (
    select RequestID, max(CreatedDate) as MaxCreatedDate 
    from table1 
    group by RequestID 
) tm 
inner join table1 t on tm.RequestID = t.RequestID and tm.MaxCreatedDate = t.CreatedDate 
+0

Esta consulta simplemente devolverá los "duplicados" nuevamente. Los valores de 'CreatedDate' son los mismos cuando' RequestID = 'CF-0000001''. – eksortso

+0

Aunque los datos no lo muestran, en realidad estaba asumiendo que los tiempos serían diferentes, de lo contrario no hay forma de saber qué estado debería devolverse cuando hay estafadores sin código rígido ... realmente no muy bien- pregunta formulada – RedFilter

5

Desde el título Te estoy adivinando solo necesita un resultado por fila única? Si este es el caso, eche un vistazo a la cláusula GROUP BY (o SELECT DISTINCT).

3

Si tiene una relación de uno a muchos en su consulta, las filas duplicadas pueden ocurrir en un lado.

Supongamos la siguiente

TABLE TEAM 
ID  TEAM_NAME 
0  BULLS 
1  LAKERS 


TABLE PLAYER 
ID  TEAM_ID  PLAYER_NAME 
0  0   JORDAN 
1  0   PIPPEN 

Y se ejecuta una consulta como

SELECT 
    TEAM.TEAM_NAME, 
    PLAYER.PLAYER_NAME 
FROM TEAM 
INNER JOIN PLAYER 

Usted recibirá

TEAM_NAME PLAYER_NAME 
BULLS  JORDAN 
BULLS  PIPPEN 

por lo que tendrá nombre del equipo duplicado. Incluso el uso de la cláusula DISTINCT, el conjunto de resultados contendrá duplicado nombre del equipo

Así que si usted no quiere TEAM_NAME duplicado en su consulta, haga lo siguiente

SELECT ID, TEAM_NAME FROM TEAM 

Y para cada ID de equipo encontrado ejecuta

SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID = <PUT_TEAM_ID_RIGHT_HERE> 

Así que de esta manera no, obtendrá duplicados referencias a un lado

cordiales,

11

Intente esto si desea mostrar una de las filas duplicadas basadas en RequestID y CreatedDate y mostrar el último HistoryStatus.

with t as (select row_number()over(partition by RequestID,CreatedDate order by RequestID) as rnum,* from tbltmp) 
Select RequestID,CreatedDate,HistoryStatus from t a where rnum in (SELECT Max(rnum) FROM t GROUP BY RequestID,CreatedDate having t.RequestID=a.RequestID) 

o si desea seleccionar una de las filas duplicadas considerando sólo CreatedDate y mostrar la última HistoryStatus vuelva a intentar la consulta a continuación.

with t as (select row_number()over(partition by CreatedDate order by RequestID) as rnum,* from tbltmp) 
Select RequestID,CreatedDate,HistoryStatus from t where rnum = (SELECT Max(rnum) FROM t) 

O si desea seleccionar una de las filas duplicadas teniendo en cuenta ID de solicitud única y mostrar la última HistoryStatus a continuación, utilizar la siguiente consulta

with t as (select row_number()over(partition by RequestID order by RequestID) as rnum,* from tbltmp) 
Select RequestID,CreatedDate,HistoryStatus from t a where rnum in (SELECT Max(rnum) FROM t GROUP BY RequestID,CreatedDate having t.RequestID=a.RequestID) 

Todas las consultas anteriores he escrito en SQL Server 2005

+0

bueno, te recomendé por accidente al intentar copiar y pegar tu código de muestra. ... Y el sistema no me permite revertirlo, así que cambio a "voto popular" y es tu buena suerte :-) – Sukotto

-3

Para recuperar solo un registro distinto de una columna duplicada de dos filas, puede usar la columna "rowid" que Oracle mantiene como clave principal, por lo que primero intente

"select rowid,RequestID,CreatedDate,HistoryStatus from temptable;" 

y luego puede obtener la segunda fila solo por el valor de la columna 'rowid' mediante el uso de la instrucción SELECT.

+0

Esto asume Oracle, y ¿cómo "traes la segunda fila por su valor de rowid"? Si alguien necesita ver el conjunto de resultados para descubrir qué es eso, esa no es una "solución" muy interesante. Por favor [edite] su pregunta si sabe cómo escribir una consulta que lo haga (sin que un humano seleccione un rowid). – Mat

0
select * from temptable 
where rnum --unique key 
in 

( 
SELECT RNUM --unique key 
    FROM temptable 
WHERE ( HistoryStatus 
) IN (SELECT    HistoryStatus 

          FROM temptable 
          GROUP BY     
HistoryStatus 
          HAVING COUNT(*) <= 1)); 

No he probado este código. He usado un código similar y funciona. La sintaxis está en Oracle.

-2

trate de usar select x distinta. * Desde ( su consulta )

Gracias.

+0

Al usar distinct, solo dará valores distintos de x table, pero no de otras tablas a las que se une –

Cuestiones relacionadas