Mysql Requête pour supprimer doublons spéciaux

Mysql Requête pour supprimer doublons spéciaux - SQL/NoSQL - Programmation

Marsh Posté le 01-01-2014 à 01:33:45    

Je vais exposer le problème (hélas) que je rencontre depuis un moment avec une table(5 champs A,B,C, D,E et F(D est une clé)) sous MySQL en donnant un extrait des données de cette table:

Code :
  1. SAR-T 270  102 05 07 X3
  2. SAR-T 271  102 05 07 X3
  3. SAR-T 272  102 05 07 X3
  4. SAR-T 273  102 05 07 X3
  5. SAR-T 274  102 05 07 X3
  6. SAR-T 275  102 05 07 X3
  7. SAR-T 276  102 05 07 X3
  8. SAR-T 277  102 05 07 X3
  9. SAR-T 278  102 05 07 X3
  10. SAR-T 279  102 05 07 X3
  11. SAR-T 7701 102 05 07 X3
  12. SAR-T 7702 102 05 07 X3
  13. SAR-T 7703 102 05 07 X3
  14. SAR-T 7704 102 05 07 X3
  15. SAR-T 7706 102 05 07 X3
  16. SAR-T 7707 102 05 07 X3
  17. SAR-T 7709 102 05 07 X3
  18. SAR-T 7710 102 05 07 X3
  19. SAR-T 7712 102 05 07 X3
  20. SAR-T 7713 102 05 07 X3
  21. SAR-T 7714 102 05 07 X3
  22. SAR-T 7715 102 05 07 X3
  23. SAR-T 7716 102 05 07 X3
  24. SAR-T 7717 102 05 07 X3
  25. SAR-T 7718 102 05 07 X3
  26. SAR-T 7719 102 05 07 X3
  27. SAR-T 7720 102 05 07 X3
  28. SAR-T 7721 102 05 07 X3
  29. SAR-T 7722 102 05 07 X3
  30. SAR-T 7723 102 05 07 X3
  31. SAR-T 7724 102 05 07 X3
  32. SAR-T 7725 102 05 07 X3
  33. GAR-Z 7726 052 035 076 X3
  34. SAR-T 7727 102 05 07 X3
  35. SAR-T 7728 102 05 07 X3
  36. SAR-T 7729 102 05 07 X3
  37. SAR-T 7740 102 05 07 X3
  38. SAR-T 7739 102 05 07 X3


 Voici ce que je veux avoir en résumé:
 
de la ligne 1 à la ligne 10, on supprime tout en remplaçant par  

Code :
  1. SAR-T 27  102 05 07 X3


En d'autres termes 27 représente les 10 enregistrements (de 270 à 279) et toutes les infos dans les 10 enregistrements sont identiques à part bien sûr la clé qui est différente forcément donc on fait un agrégat en quelque sorte et on rédume tout dans l'enregistrement ci dessus qui a 27 comme clé(bien évidemment cette valeur nouvelle est différente de toutes les autres valeurs existantes déjà dans le champs B sinon il y aurait une erreur)
 
de la ligne 11 à la ligne 17

Code :
  1. SAR-T 770  102 05 07 X3


malgré le fait que la lignes correspondant  aux deux IDs 7705 et 7708 n'existent pas dans la liste.
 
 
de la ligne 18 à 26, on supprime tout pour remplacer par la ligne

Code :
  1. SAR-T 771  102 05 07 X3


 
de la ligne 27 à 37 on garde tout tel quel car malgré la sériation parfaite de l'ID, on  a des valeurs différentes des champs C, D et E à la ligne 33, donc on ne peut pas grouper.
 
 
Merci infiniment d'avoir la patience de me lire car je trouve tout ça ennuyeux malgré le fait que ce soit mon premier souci pour le moment.
 
Merci infiniment de votre aide.

Reply

Marsh Posté le 01-01-2014 à 01:33:45   

Reply

Marsh Posté le 01-01-2014 à 01:55:47    

Salut.
 
Vite fait, syntaxe pas forcement correcte donc a corriger si besoin (basee sur Oracle mais je suppose que sur un truc simple comme ca c'est quasiment pareil), pas teste, et probablement peu performant si gros volumes.
 
1 - Crees une table temporaire avec les meme champs
 
2 - Inseres-y les lignes "resumees". Pour cela c'est simple: cette requete te donne toutes les lignes resumees (en supposant que le champ B est un nombre):

SELECT DISTINCT a, FLOOR(b/10) AS new_b, c, d, e, f  
FROM table;

Sauf que tu ne veux pas resumer si la colonne B "tronquee" apparait plusieurs fois - donc il suffit de les filtrer:

SELECT DISTINCT a, FLOOR(b/10) AS new_b, c, d, e, f  
FROM table
GROUP BY FLOOR(b/10)
HAVING COUNT(*)>0;

Donc ton insert complet va ressembler a ca:

INSERT INTO table_temp(a,b,c,d,e,f)
SELECT DISTINCT a, FLOOR(b/10) AS new_b, c, d, e, f  
FROM table
GROUP BY FLOOR(b/10)
HAVING COUNT(*)>0;

3 - Maintenant que tu as tes lignes resumees dans ta table temporaire, tu vires les lignes qui les ont generees de ta table de depart:

DELETE FROM table WHERE FLOOR(b/10) IN (SELECT b FROM table_temp);

4 - Maintenant, tu n'as plus qu'a recopier les lignes resumees a la place:

INSERT INTO table(a,b,c,d,e,f)
SELECT a,b,c,d,e,f
FROM table_temp;

5 - Tu peux maintenant te debarasser de la table temporaire.


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 01-01-2014 à 02:11:24    

Merci infiniment de votre réponse,
Pour commencer je rectifie mon post la clé est en b et non en D comme mentionné plus haut.
 

Citation :

Vite fait, syntaxe pas forcement correcte donc a corriger si besoin (basee sur Oracle mais je suppose que sur un truc simple comme ca c'est quasiment pareil), pas teste, et probablement peu performant si gros volumes.


Non votre requête est syntaxiquement parfaite, je viens de la tester.
 
Deuxième chose importante que je n'ai pas dite clairement:N'est concerné par ce regroupement ne concerne que les enregistrements qui:

  • sont identiques par tous leurs champs sauf le clé en B(qui est une valeur entière)
  • ont leur champ clé qui appartient à une sériation existante dans dans d'autres enregistrements(exple :248, dans une série 242,243,244,246,247,249 et qui en plus partagent tous les autres champs en toute rigueur!).


 Cas limite je donne un exemple si on a les 5 enregistrements qui suivent
Zarbi 235  192 05 07 R3
Zarbi 236  192 05 07 R9
Zarbi 237  196 16 07 R3
Zarbi 238  192 05 07 R3
Darbi 239  192 05 07 R3
 
Les 2 enregistrements
Zarbi 235  192 05 07 R3 et Zarbi 238  192 05 07 R3 seront regroupés en Zarbi 23  192 05 07 R3
les 3 autres seront laissés tels qu'ils sont
Zarbi 236  192 05 07 R9
Zarbi 237  196 16 07 R3
Darbi 239  192 05 07 R3
 
donc au final on aurait
Zarbi 23  192 05 07 R3
Zarbi 236  192 05 07 R9
Zarbi 237  196 16 07 R3
Darbi 239  192 05 07 R3
 
 
 
 
Merci infiniment.


Message édité par maestro1303 le 01-01-2014 à 11:54:06
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed