2011-08-17 3 views
1

Je dois me débarrasser des doublons de ma table. Je les ai en double comme ceci: -Comment supprimer l'entrée dupliquée souhaitée en utilisant TSQL?

SELECT col1 
FROM table_01 
GROUP BY col1 
HAVING (COUNT(col1) > 1) 

table_01 a une autre colonne 'col2' qui est nvarchar qui contient la date et l'heure. Cette col2 a NULL ainsi. Maintenant, comment garder la dernière entrée (par date) et supprimer d'autres doublons. Je n'ai aucune idée? PL. Aidez-moi.

+0

Souligné que la colonne "date" alléguée est en réalité nvarchar. Nous vous recommandons fortement de reconsidérer en utilisant une colonne datetime pour col2. Pourquoi voudriez-vous stocker des informations de date/heure sous forme de chaîne? Vous perdez beaucoup de capacité en faisant cela et vous ouvrez aussi en permettant toutes sortes de données indésirables, dates invalides, etc. –

+0

Je suis d'accord avec vous. Mais c'est comme ça que fonctionne le système existant. Le changer en datetime est hors de ma portée. – User13839404

Répondre

3
;WITH x AS 
(
    SELECT col1, 
    rn = ROW_NUMBER() OVER 
    (
     PARTITION BY col1 
     ORDER BY CONVERT(DATETIME, COALESCE(col2, '19000101')) DESC 
    ) 
    FROM table_01 
) 
DELETE x WHERE rn > 1; 
+0

La colonne Col2 est nvarchar et contient la date. – User13839404

+0

Pourquoi Col2 n'est-il pas une colonne datetime? Besoin de plus d'informations si vous voulez déterminer correctement "dernier" - quel est le format des données dans cette colonne? Pouvez-vous s'il vous plaît montrer quelques exemples de données? –

+0

Aaron: Col2 a aussi des entrées NULL. Cela signifie qu'en dehors des doublons, une entrée est nulle (pour quelques enregistrements seulement). Je préfère garder ce disque là où il n'est pas nul. – User13839404

1

La magie d'une sous-requête corrélée. Vous avez dit que les deux enregistrements ont une valeur différente pour une autre colonne qui contient des dates et que vous voulez supprimer l'ancien enregistrement?

DELETE FROM tablea 
WHERE tablea.dateentered < (SELECT MAX(i.dateentered) 
          FROM tablea i 
          WHERE tablea.id = i.id) 
Questions connexes