3
votes

Supprimer les doublons, en conserver l'un d'entre eux, grouper par

Je dois supprimer tous les doublons, tous sauf un, pour chacun des ID de table. Comme le suivant. Je dois supprimer tous les doublons sur valueid pour 01,02,03 ...

Original:

WITH CTE AS(
   SELECT valueid,
       RN = ROW_NUMBER()OVER(PARTITION BY valueid ORDER BY valueid)
   FROM tblvalues
)
DELETE FROM CTE WHERE RN > 1

Doit se terminer comme:

id      | valueid   |   data
____________________________
01      | 1001      |   datadata1       
01      | 1002      |   datadata2
02      | 1323      |   datamoredata123
03      | 22123     |   evenmoredata
03      | 24444     |   andalsomore

J'essayais de le faire avec quelque chose comme ça, mais je ne comprends pas comment puis-je regrouper cette suppression sur l'identifiant

id      | valueid   |   data
____________________________
01      | 1001      |   datadata1       
01      | 1002      |   datadata2
01      | 1001      |   datadata1
02      | 1323      |   datamoredata123
02      | 1323      |   datamoredata123
03      | 22123     |   evenmoredata
03      | 24444     |   andalsomore

Des suggestions?

Merci d'avance


0 commentaires

3 Réponses :


3
votes

Vous êtes assez proche. Vous devez modifier la clause partition by . Vous voulez une ligne par paire id / valueid , donc ceux-ci doivent tous deux être dans la clause de partitionnement:

WITH todelete AS (
   SELECT valueid,
       RN = ROW_NUMBER() OVER (PARTITION BY id, valueid ORDER BY data)
   FROM tblvalues
)
DELETE FROM todelete WHERE RN > 1;


1 commentaires

De plus, j'inclurais la colonne de données dans l'ordre par (après le valueid) ...



4
votes

Vous devez ajouter la colonne id au PARTITION:

WITH CTE AS(
   SELECT valueid,
       RN = ROW_NUMBER()OVER( PARTITION BY id, valueid ORDER BY data)
   FROM tblvalues
)
DELETE FROM CTE WHERE RN > 1

De cette façon, vous supprimez le valueid code en double > valeurs séparément pour chaque id . La colonne data détermine les doublons à supprimer.


0 commentaires

-1
votes

Une manière très simple de faire ceci est d'ajouter l'index UNIQUE dans la colonne (valueid). Lorsque vous écrivez une instruction ALTER, spécifiez le mot-clé IGNORE.

ALTER IGNORE TABLE tblvalues
ADD UNIQUE INDEX idx_name (valueid);

Cela supprimera toutes les lignes en double. Comme avantage supplémentaire, les futurs INSERT qui sont des doublons seront erronés. Comme toujours, vous pouvez effectuer une sauvegarde avant d'exécuter quelque chose comme ça.


4 commentaires

Lors de la publication d'une réponse codée, il est utile au PO d'expliquer la réponse que vous avez fournie. Dans ce cas, comment cette réponse aide-t-elle l'OP DELETE les lignes dupliquées?


Merci pour la mise à jour, cependant, si vous exécutez cela, vous obtiendrez l'erreur Type d'objet inconnu 'IGNORE' utilisé dans une instruction CREATE, DROP ou ALTER. . db <> violon


Réponse de mise à jour @Larnu, désolé


Le fait est qu'il s'agit d'une conception de base de données déjà fermée. Je ne peux pas vraiment le modifier pour le moment. Merci pour votre temps et votre réponse.