2012-02-11 2 views
0

cette question est liée à la mienne il y a juste une minute. Je cherche des enregistrements en double dans une table. Je suis à la recherche de champs correspondants "Symbol" et "TradeDate". J'ai un champ ID unique pour la table. Ma logique est la suivante: renvoyer les enregistrements avec un champ ID qui n'est pas la valeur d'ID minimale qui a un nombre> 1 pour ce symbole et la combinaison de date. Voici ce que j'ai ... sql server ne se plaint pas jusqu'à ce que je le lance, il dit que mon sous-requête retourne plus d'une valeur:Sous-requête SQL pour trouver des doublons

SELECT Symbol , ID FROM tblDailyPricingAndVol 
    WHERE (SELECT Count(TradeDate) FROM tblDailyPricingAndVol AS T2 
      WHERE T2.Symbol = Symbol AND T2.TradeDate = TradeDate GROUP BY Symbol) > 1 
      AND ID <> (SELECT MIN(ID) FROM tblDailyPricingAndVol AS T3 
       WHERE T3.Symbol = Symbol AND T3.TradeDate = TradeDate 
      GROUP BY Symbol) 

Répondre

2
;WITH x AS 
(
    SELECT ID, TradeDate, Symbol, 
    rn = ROW_NUMBER() OVER (PARTITION BY TradeDate, Symbol ORDER BY ID) 
    FROM dbo.tblDailyPricingAndVol 
) 
SELECT ID, TradeDate, Symbol, rn 
FROM x WHERE rn > 1 
ORDER BY TradeDate, Symbol; 

Si votre question suivante va être "maintenant je veux supprimer les doublons" laissez-moi vous épargner quelques problèmes, car c'est un simple changement:

;WITH x AS 
(
    SELECT ID, rn = ROW_NUMBER() OVER (PARTITION BY TradeDate, Symbol ORDER BY ID) 
    FROM dbo.tblDailyPricingAndVol 
) 
DELETE x WHERE rn > 1; 
+0

Merci. J'ai édité ma description de la logique en fonction de votre message ... Je veux retourner tout sauf l'identifiant minimum. Quand je travaille, je vais le changer en une instruction delete. Existe-t-il un moyen de le faire avec un simple select/subquery? (pas familier avec PARTITION). Je me demande comment l'une ou l'autre de mes sous-requêtes peut renvoyer plus d'une valeur, chacune étant une fonction agrégée. – StatsViaCsh

+0

On dirait que je vous ai préempté. PS Dans les sous-requêtes, vous avez uniquement le symbole GROUP BY. –

+0

Je viens d'attraper ça ... J'ai changé pour "GROUP BY Symbol, TradeDate" en vain. – StatsViaCsh