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
3 Réponses :
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;
De plus, j'inclurais la colonne de données dans l'ordre par (après le valueid) ...
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.
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.
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.