2009-09-18 12 views
6

Ho un temptable che assomiglia a questo:Come restituire solo 1 riga se più file duplicate e ancora restituire righe che non sono duplicate?

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 

E come mi piacerebbe tabella di guardare alla fine è come questo:

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 

Vale a dire il duplicato CF-0000001 deve essere rimosso.

Come posso restituire o dovrei dire selezionare solo UNA riga se ci sono più righe duplicate e ancora restituire righe che non sono duplicati?

+6

Entrambi i tavoli sono uguali. Si prega di correggere l'output atteso. – shahkalpesh

+0

Restituisce i duplicati in ** COSA **? MySQL SQL? Oracle SQL? CouchDB? Cassandra? MS SQL Server? Una lista in Haskell? Una comprensione per SQuery in Scala? Un file di testo in Perl? Ragazzo, potrei continuare ... –

+1

Quale riga deve essere restituita se RequestID e CreatedDate sono entrambi uguali? O non importa? – eksortso

risposta

0

Se si tratta di una domanda di SQL, e capisco quello che stai chiedendo, (non è del tutto chiaro), basta aggiungere distinta alla query

Select Distinct * From TempTable 
+1

Che non aiuta Chebu , perché i valori in HistoryStatus sono diversi. – 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

Questa query restituirà nuovamente i "duplicati". I valori di 'CreatedDate' sono gli stessi quando 'RequestID =' CF-0000001''. – eksortso

+0

Anche se i dati non lo mostrano, in realtà stavo supponendo che i tempi sarebbero stati diversi, altrimenti non c'è modo di sapere quale stato deve essere restituito quando ci sono i duplicati senza hard-coding ... davvero non molto bene- domanda formulata – RedFilter

5

Dal titolo ti sto indovinando serve solo un risultato per riga unica? Se questo è il caso, dai un'occhiata alla clausola GROUP BY (o SELECT DISTINCT).

3

Se si dispone di una relazione uno a molti nella query, è possibile che le righe duplicate si verifichino su un lato.

Supponiamo la seguente

TABLE TEAM 
ID  TEAM_NAME 
0  BULLS 
1  LAKERS 


TABLE PLAYER 
ID  TEAM_ID  PLAYER_NAME 
0  0   JORDAN 
1  0   PIPPEN 

E si esegue una query come

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

Otterrete

TEAM_NAME PLAYER_NAME 
BULLS  JORDAN 
BULLS  PIPPEN 

in modo da avere duplicato nome della squadra. Anche usando clausola DISTINCT, i vostri risultati conterrà duplicato nome della squadra

Quindi, se non si vuole TEAM_NAME duplicato nella query, effettuare le seguenti operazioni

SELECT ID, TEAM_NAME FROM TEAM 

E per ogni ID squadra incontrato esegue

SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID = <PUT_TEAM_ID_RIGHT_HERE> 

Quindi in questo modo non sarà possibile ottenere duplicati riferimenti da un lato

saluti,

11

Provare questo se si desidera visualizzare una delle righe duplicate in base a RequestID e CreatedDate e mostrare l'ultimo 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 se si desidera selezionare una delle righe duplicate considerando solo CreatedDate e mostrare l'ultima HistoryStatus quindi provare la query di seguito.

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) 

Oppure, se si desidera selezionare una delle righe duplicate considerando solo richiesta ID e mostrare l'ultima HistoryStatus quindi utilizzare la query di seguito

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) 

Tutte le domande di cui sopra ho scritto in SQL Server 2005 .

+0

beh, l'ho downvoted per errore quando provo a copiare e incollare il codice di esempio. ... E il sistema non mi permetterà di capovolgerlo, quindi cambio "upvote" ed è la tua buona fortuna :-) – Sukotto

-3

per andare a prendere un solo record distinto da colonna duplicato di due file che è possibile utilizzare colonna "identificativo", che viene mantenuto da Oracle stessa come chiave primaria, in modo da provare prima

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

e quindi è possibile recuperare la seconda riga solo dal valore della colonna 'rowid' utilizzando nell'istruzione SELECT.

+0

Questo presuppone Oracle, e come si "recupera la seconda riga dal suo valore di rowid"? Se qualcuno ha bisogno di guardare il risultato per capire di cosa si tratta, non è una "soluzione" molto interessante. Per favore [modifica] la tua domanda se sai come scrivere una query che lo fa (senza un essere umano che seleziona 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)); 

Non ho testato questo codice. Ho usato un codice simile e funziona. La sintassi è in Oracle.

-2

provare a utilizzare selezionare x distinta. * Da ( la query )

Grazie.

+0

Usando distinto darà solo valori distinti dalla tabella x, ma non dalle altre tabelle che si stanno unendo –

Problemi correlati