8
votes

Comment revenir seulement 1 rangée si plusieurs lignes en double et retournent toujours des lignes qui ne sont pas duplicates?

J'ai un tentable qui ressemble à ceci: xxx

et comment je voudrais que la table examine la fin est comme ceci: xxx

IE Le duplicata cf-0000001 doit être supprimé.

Comment puis-je retourner ou devrais-je choisir une seule ligne s'il y a plusieurs lignes en double et retournez toujours des lignes qui ne sont pas dupliqués?

sql

4 commentaires

Les deux tables sont identiques. Veuillez corriger la sortie attendue.


Quelle ligne doit être retournée si demandesId et crééDate sont identiques? Ou ce n'est-ce pas?


Ma solution suppose que les dates seront effectivement différentes, de sorte que vous puissiez simplement choisir une date maximale - sinon, besoin d'un moyen de classer les statuts pour savoir qui devrait gagner - le codage dur semble inélégant ...


Related: Equivalent Oracle de Postgres 'distincts sur?


8 Réponses :


-1
votes

S'il s'agit d'une question SQL, et je comprends ce que vous demandez, (ce n'est pas tout à fait clair), ajoutez simplement des distincts à la requête

   Select Distinct * From TempTable


1 commentaires

Cela n'aidera pas Chebu, car les valeurs de HistoryStatus sont différentes.



4
votes
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

2 commentaires

Cette requête retournera à nouveau les "duplicats". Les valeurs de crééDate sont identiques lorsque requierd = 'cf-0000001' .


Bien que les données ne le montrent pas, j'étais en train de supposer que le temps serait différent, sinon il n'ya aucun moyen de savoir quel statut doit être retourné lorsqu'il y a des hausses de dupes sans le codage dur ... Vraiment pas un très bien libéré question.



5
votes

Du titre, je suppose que vous n'avez besoin que d'un seul résultat par rangée unique? Si tel est le cas, jetez un coup d'œil à la groupe par clause (ou Sélectionner distinct ).


0 commentaires

3
votes

Si vous avez une relation unique dans votre requête, des lignes en double peuvent survenir d'un côté.

Supposons le suivant p> xxx pré>

et vous exécutez une requête comme P>

SELECT PLAYER_NAME FROM PLAYER WHERE TEAM_ID = <PUT_TEAM_ID_RIGHT_HERE>


0 commentaires

12
votes

Essayez ceci si vous souhaitez afficher l'une des lignes en double en fonction de demandesId et créaturesDate et d'afficher les derniers historistesStatus.

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)


1 commentaires

Eh bien, je vous ai bownté par accident lorsque vous essayez de copier-coller votre exemple de code. ... et le système ne me laissera pas renverser pour que je puisse changer de "upvote" et c'est votre bonne chance :-)



-3
votes

Pour récupérer un seul enregistrement distinct de la colonne en double de deux lignes, vous pouvez utiliser une colonne "Rowid" qui est conservée par Oracle lui-même comme clé primaire, alors essayez donc xxx

et puis vous pouvez Fetch Second Row Seulement par sa valeur de la colonne «Rowid» à l'aide d'une instruction SELECT.


1 commentaires

Cela suppose Oracle et comment allez-vous "aller chercher la deuxième ligne par sa valeur de Rowid"? Si quelqu'un doit examiner le résultat fixé pour déterminer ce que c'est, ce n'est pas une "solution" très intéressante. S'il vous plaît Modifier Votre question si vous savez écrire une requête qui fait cela (sans un humain sélectionnant un railid).



0
votes
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));
I have not tested this code. I have used similar code and it works.
The syntax is in Oracle.

0 commentaires

0
votes

Utilisation d'espaces de noms et de sous-candidats Vous pouvez le faire:

CF-0000001, 2009-08-26 13:07:01.000,    Completed
CF-0000114, 2009-08-26 13:07:01.000,    Completed
CF-0000115, 2009-08-26 13:07:01.000,    Completed
CF-0000112, 2009-08-26 13:07:01.000,    For Review
CF-0000113, 2009-08-26 13:07:01.000,    For Review


0 commentaires