IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Comparaison et regroupement de quasi doublons


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Comparaison et regroupement de quasi doublons
    Bonjour à tous,

    Je suis novice en SQL et je suis confronté à un soucis de taille : je dispose d'une table remplie de quasi doublons que j'aimerais rassembler.

    Je souhaiterais rassemblez tous les quasi doublons sous une seule et même dénomination (par exemple j'aimerais regrouper le nom "TTES Rémy S.A" avec "TPRTES Rémy S.A" sous une seule et même dénomination).

    Je ne sais pas comment modifier cette requête SQL pour arriver au résultat désiré :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Table.[Champ1], Table.[Champ2], Table.[Champ3], Table.[Champ4], Table.[Champ5]
    FROM Table
    WHERE (((Table.[Champ1]) In (SELECT [Champ1] FROM [Table] As Tmp GROUP BY [Champ1] HAVING Compte(*)>1 And [Champ1] = [Table].[Champ1])))
    ORDER BY Table.[Champ1]

    (Ici j'aimerais donc comparer les valeurs du Champ1 de la table Table deux à deux...)


    Une commande du type Gauche([champ1],15) peut elle fonctionner pour comparer les valeurs de mon champ1 deux à deux sur les 15 premieres lettres ?

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 57
    Points
    57
    Par défaut
    bonjour
    le probleme, c'est que les noms se ressemblent mais ne sont pas les mêmes
    il vous faudrait un code qui transforme les noms. mais access (et tout les autre d'ailleur) ne peuvent pas se baser sur une aproximation.

    Dans le cas ou vous auriez "TTES Rémy S.A" et "TT Ramony S.A"(exemple) qui existent et ne sont pas pareil, faut il les regrouper ou non ?

    Ensuite, les autres champs de la table sont ils pareil dans les deux enregistrements ?

    Et pour finir, une question : quel valeurs contiennent les autres champs de la table ?

    en espérant pourvoir vous aider, fisto

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Il faut jouer sur le comparatuer LIKE de la manière suivante :
    Ainsi cela t'extraira tous les noms de sociétés contenant le mot "Rémy".

    Starec

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 57
    Points
    57
    Par défaut
    après, le probleme, c'est de le faire pour chaque enregistrement. s'il y en a 40, ça va. s'il y en a 5000, c'est plus long

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par fisto
    après, le probleme, c'est de le faire pour chaque enregistrement. s'il y en a 40, ça va. s'il y en a 5000, c'est plus long
    Re,

    Tu ne le fais pas pour chaque enregistrement, c'est juste un exemple que je t'ai mis.
    Tu dois passer le nom que tu recherches dans une variable (string), et c'est elle que tu passes en paramètre de ta requête.

    C'est surtout le principe avec l'opérateur LIKE que je voulais te montrer.

    Starec

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord, merci pour votre aide,

    Je vais essayer de préciser davantage mon problème :
    Dans votre exemple "TTES Rémy S.A" et "TT Ramony S.A", Je voudrais pouvoir choisir de ne pas les regrouper.
    Evidemment, cela nécessiterait une requête me demandant confirmation et cela risque de compliquer considérablement les choses.


    Une simple procédure permettant de sortir tous les "quasi doublons" (ou toutes les valeurs à peu prêt similaires) me permettrait de regrouper manuellement les quasi-doublons avérés.


    Voici ma table :

    Ma table (appelons la Essai) se compose de 5 champs :
    1. Numéro (clé primaire)
    2. Nom (texte)
    3. Nb d'OR (Valeur numérique)
    4. Somme (Valeur numérique)
    5. Rentabilité (Valeur numérique)

    Les 3 derniers champs (ainsi que la clé primaire) sont systématiquement différents. Les quasi-doublons se trouvent uniquement dans le deuxième champ (le champ "Nom").

    J'ai trouvé ces quelques requêtes qui peuvent peut être résoudre mon problème mais que je n'arriver pas à programmer correctement :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Essai.Nom, Essai.Numéro, Essai.OR, Essai.Sommes, Essai.Rentabilité
    FROM Essai
    WHERE (((Essai.Nom) In (SELECT [Nom] FROM [Essai] As Tmp GROUP BY [Nom],Left([Nom],10) HAVING Count(*)>1 )))
    ORDER BY Essai.Nom;

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT *
    FROM   Essai
    WHERE  EXISTS
       (SELECT *
        FROM   Essai2
        WHERE  Essai.Numéro <> Essai2.Numéro
          AND  (LOWER(Essai.Nom)    LIKE '%' + LOWER(Essai2.Nom) + '%'    OR LOWER(Essai2.Nom) LIKE '%' + LOWER(Essai.Nom)+'%'))

    Edit: Comment puis je utiliser dans ce cas la fonction like pour comparer deux à deux les noms de ma table ?

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    il existe une mesure des chaines semblables c'est la distance de
    levensthein
    http://fr.wikipedia.org/wiki/Distance_de_Levenshtein

    le programme suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    Function distance(s1 As String, s2 As String) As Integer
     Dim l1 As Integer
     Dim l2 As Integer
     Dim d() As Integer
    Dim i As Integer
    Dim j As Integer
     Dim cout As Integer
    Dim effacement As Integer
      Dim insertion As Integer
     Dim substitution As Integer
     Dim mini As Integer
     Dim temp As String
     l1 = Len(s1)
     l2 = Len(s2)
     ReDim d(0 To l1, 0 To l2)
      For i = 0 To l1
     d(i, 0) = i
      Next i
      For j = 0 To l2
      d(0, j) = j
     Next j
     For i = 1 To l1
        For j = 1 To l2
        If UCase(Mid(s1, i, 1)) = UCase(Mid(s2, j, 1)) Then
         cout = 0
         Else
        cout = 1
         End If
           effacement = d(i - 1, j) + 1
         insertion = d(i, j - 1) + 1
        substitution = d(i - 1, j - 1) + cout
         mini = effacement
         If insertion < mini Then mini = insertion
        If substitution < mini Then mini = substitution
        d(i, j) = mini
       Next j
      Next i
     distance = d(l1, l2)
    'For i = 0 To l1
    'temp = ""
    'For j = 0 To l2
    'temp = temp & d(i, j) & ";"
    'Next j
    'temp = Left(temp, Len(temp) - 1)
    'Debug.Print temp
    'Next i
     End Function

    implémente cette fonction en vba

    mais généralement seul un utilisateur peut décider

    par contre la fonction couplée avec d'autres rapprochements (code postal, indicatif tel) peut être très discriminante
    Elle est pas belle la vie ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 57
    Points : 57
    Points
    57
    Par défaut
    c'est un truc de malade !
    ensuite, il faudra faire une boucle géante qui prend le premier enregistrement et qui le compare au x suivant. puis le deuxieme qui est comparé au premier et au 3ème et plus, ...
    j'espère que tu as du temps... et je te conseil de la lancer un soir pour le lendemain.
    Par contre, comment faire dans le cas ou le nombre de changement (par rapport a la distance de levensthein) est inférieur a 5 (par exemple, ça me semble satisfaisant) ? tout regrouper et demander a la fin de l'exécution ou demander à chaque doublons ?

    Il reste aussi toujours le problème des :

    3. Nb d'OR (Valeur numérique)
    4. Somme (Valeur numérique)
    5. Rentabilité (Valeur numérique)

    lequel des deux le programme prend-il ?
    et aussi pour la clé primaire. s'il y a des tables en relations, ça risque de faire de belles erreurs

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    Citation Envoyé par fisto
    c'est un truc de malade !
    ensuite, il faudra faire une boucle géante qui prend le premier enregistrement et qui le compare au x suivant. puis le deuxieme qui est comparé au premier et au 3ème et plus, ...
    moi la santé ça va, et toi ?

    ce n'est pas très contagieux et on en guérit très bien
    5 est une distance élevée

    on ne procéde pas par une boucle mais par une multiplication cartésienne
    avec une clause sur la distance et une clause sur nom1<nom2 ce qui réduit fortement les possibilités (taille echantillon n*n/2)/critére choisi

    à part le soundex (qui n'a pas trop sa place ici) je ne connais auncun autre algo de comparaison floue de chaîne (le like donnera à mon avis des résultats peu probants) il devrait figurer dans les sources

    pour une utilisation plus confortable de la distance
    utiliser distance(sansaccents(texte1);sansaccents(texte2))

    il existe une fonction sans accents dans la faq ou les sources
    Elle est pas belle la vie ?

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci à toi random mais je serais bien incapable d'utiliser cette requête (qui par ailleurs semble vraiment efficace). Je cherche quelque chose de vraiment simple... Comment pourrais je utiliser l'opérateur "like" pour éliminer les doublons les plus évidents ?

    Je n'arrive pas à trouver la synthaxe correcte pour mettre en oeuvre le fameux "like" "lower".

    Merci.

Discussions similaires

  1. recherche de quasi doublons dans 1 table
    Par tuxy dans le forum Requêtes
    Réponses: 5
    Dernier message: 27/10/2008, 21h35
  2. Regroupement évitant les doublons
    Par vinz945 dans le forum Deski
    Réponses: 1
    Dernier message: 30/04/2008, 13h11
  3. Quasi Doublons sous postgresql
    Par Pogny dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 28/04/2008, 14h29
  4. Selection de Quasis Doublons
    Par norior dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/01/2006, 14h30
  5. quasi doublon
    Par chris30 dans le forum Oracle
    Réponses: 5
    Dernier message: 09/09/2004, 14h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo