Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Discussion: Enlever les doublons

  1. #1
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2013
    Messages : 4
    Points : 0
    Points
    0

    Par défaut Enlever les doublons

    Bonjour,

    Je suis confronté a un problème, en apparence simple mais qui me pose beaucoup de soucis (principalement parce que je suis pas très à l'aise avec le SQL également).
    J'ai plusieurs base a "nettoyer", elles ont toute une architecture différentes (autant sur le nombre de variable, que sur leurs type ou leurs taille).
    Pour schématiser le problème, j'ai créer une base de test simple :

    Code :
    1
    2
    3
    4
    5
    6
    7
    A   B   C   D   // Quatre VARIABLES
     
    A1  B1  C1  D1  // Quatre valeurs
    A1      C1  D1
        B1  C1  D1
            C1  
    A1  B1  C1
    Comme vous pouvez le voir, ma table est composé de ligne complète et quasiment identique mais auquel il manque des champs.
    Je peux pas les garder dans ma base, ces lignes représentent juste une perte d'information.
    J'arrive a traiter le cas où deux lignes sont strictement identique (doublons parfait) et à supprimer toutes ces lignes.

    J'ai naïvement fait un algorithme qui compare chaque variable avec les variables des lignes suivantes mais l'algo est absolument pas évolutif et absolument pas pratique (pour 4 variables, 4*4 IF différents ...)
    Il me faudrait un algo qui puisse se déplacer de variables en variables sans utiliser leurs noms et qui s'arrête quand la ligne ne contient plus de variable à comparer (comme une boucle FOR pour parcourir un tableau) mais j'ai aucunes idées de comment faire ...

    Si vous avez une idée de comment éclairer ma lanterne, je vous remercie d'avance
    ( et si jamais je suis pas très clair dans mes explications, je peux toujours ré expliquer )

  2. #2
    Membre chevronné Avatar de jkofr
    Homme Profil pro Jacques Kostic
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Nom : Homme Jacques Kostic
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2006
    Messages : 484
    Points : 714
    Points
    714

    Par défaut

    CREATE TABLE temptable AS SELECT DISTINCT nvl (var1,'vide'),nvl (var2,'vide'),nvl (var3,'vide'),nvl (var4,'vide') FROM tatable;

    Tu contrôle tes données.

    TRUNCATE tatable;

    INSERT INTO tatable SELECT * FROM temptable;

    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  3. #3
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2013
    Messages : 4
    Points : 0
    Points
    0

    Par défaut

    Donc si j'ai bien compris, l'idée est de créer une table contenant tout ce qui est différent de la ligne :
    nvl (var1,'vide'),nvl (var2,'vide'),nvl (var3,'vide'),nvl (var4,'vide')

    Mais ca me reviens davantage a enlever ce qui est différent plus que la perte d'information en soit, il me semble.

    Imaginons :

    Code :
    1
    2
    3
    4
    5
    6
    7
    A   B   C  D   // Quatre VARIABLES
     
         B1 C1 D1  // Quatre valeurs
    A1      C1 D1
         B1 C1 D1
              C1  
         B1 C1
    Il devrait rester :
    Code :
    1
    2
    3
    4
    5
     
    A   B   C  D   // Quatre VARIABLES
     
         B1 C1 D1  // Quatre valeurs
    A1      C1 D1
    Car tout le reste signifie de la perte d'information et la ligne qui contient A1 ( mais pas B1 )
    doit etre conservé en vu d'une futur fusion.

  4. #4
    Membre chevronné Avatar de jkofr
    Homme Profil pro Jacques Kostic
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Nom : Homme Jacques Kostic
    Âge : 45
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2006
    Messages : 484
    Points : 714
    Points
    714

    Par défaut

    Non, seul la ligne 5 disparait.

    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  5. #5
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2013
    Messages : 4
    Points : 0
    Points
    0

    Par défaut

    Oui, c'est le cadre des doublons parfait (toute les variables contiennent exactement la meme chose qu'un autre champs).
    J'essaye de cibler les doublons en perte d'information ...

  6. #6
    Membre chevronné
    Profil pro François
    Inscrit en
    février 2010
    Messages
    411
    Détails du profil
    Informations personnelles :
    Nom : François

    Informations forums :
    Inscription : février 2010
    Messages : 411
    Points : 742
    Points
    742

    Par défaut

    C'est vous qui connaissez les règles, et à moins de les écrire explicitement ici dans un exemple complet, on ne peut rien faire.
    Ainsi, dans votre exemple précédent, vous gardez:
    De ce que j'ai compris, vous souhaitez à l'étape suivante les fusioner pour obtenir A1 B1 C1 D1
    Mais dans le cas suivant, vous faite quoi?
    Code :
    1
    2
    3
    A1      C1  D1
        B1  C1  D1
        B2  C1  D1
    Et pourquoi la solution ne serait-elle pas A1 B3 C1 D1?

    Bref, sur quoi vous basez vous pour décider de ce qu'il faut faire ?
    Si vous n'avez pas de règle générale, on ne peut pas vous aider, et la solution manuelle de jkofr fonctionne toujours.


    Pour revenir à votre problème original:
    Vous devriez jeter un oeil du côté des contraintes, UNIQUE ou CHECK afin d'éviter ce problème à l'avenir. Ca va rien résoudre tout de suite, mais ça vous évitera de devoir refaire la même chose dans 6mois.

  7. #7
    Membre Expert
    Inscrit en
    août 2009
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 1 040
    Points : 1 604
    Points
    1 604

    Par défaut

    Citation Envoyé par Rams7s Voir le message
    C'est vous qui connaissez les règles, et à moins de les écrire explicitement ici dans un exemple complet, on ne peut rien faire.
    Ainsi, dans votre exemple précédent, vous gardez:
    De ce que j'ai compris, vous souhaitez à l'étape suivante les fusioner pour obtenir A1 B1 C1 D1
    De ce que dit l'OP, il ne s'agit que d'une étape supplémentaire, pour laquelle il ne demande pas (encore) d'aide. Il ne souhaite pour l'instant que traiter les cas où une ligne contient strictement une autre.
    Personnellement je ferai chose du genre (j'ai utilisé le rowid faute d'avoir la clé primaire de la table, s'il y en a une) [et c'est non testé/brouillon] :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    WITH tableNb AS
    (
    SELECT rowid,A,B,C,D
             ,CASE WHEN A IS NOT NULL THEN 1 ELSE 0 END
             +CASE WHEN B IS NOT NULL THEN 1 ELSE 0 END
             +CASE WHEN C IS NOT NULL THEN 1 ELSE 0 END
             +CASE WHEN D IS NOT NULL THEN 1 ELSE 0 END
             AS nb
      FROM TABLE
    )
    DELETE 
      FROM TABLE t1
     WHERE t1.rowid IN (SELECT t3.rowid
                                FROM tableNb t2, tableNb t3
                              WHERE (t3.A = t2.A OR (t3.A IS NULL AND t2.A IS NOT NULL))
                                  AND (t3.B = t2.B OR (t3.B IS NULL AND t2.B IS NOT NULL))
                                  AND (t3.C = t2.C OR (t3.C IS NULL AND t2.C IS NOT NULL))
                                  AND (t3.D = t2.D OR (t3.D IS NULL AND t2.D IS NOT NULL))
                                  AND t3.rowid != t2.rowid  -- ou avec une clé primaire
                                  AND (t2.Nb > t3.Nb  -- inclusion stricte
                                         OR
                                         t2.Nb = t3.Nb AND t2.rowid > t3.rowid -- doublon
                                        )
                           )

  8. #8
    Membre chevronné
    Profil pro François
    Inscrit en
    février 2010
    Messages
    411
    Détails du profil
    Informations personnelles :
    Nom : François

    Informations forums :
    Inscription : février 2010
    Messages : 411
    Points : 742
    Points
    742

    Par défaut

    Mais quand il souhaite garder A1 C1 D1 et B1 C1 D1, le second tuple n'est pas contenu dans le premier.

    Vrai que j'ai bruler une étape en parlant de la fusion. Il ne faut pas lire cette phrase là! Le reste du message avait justement trait à quelles lignes il faut effacer, et lesquelles garder, et pourquoi.

    Enfin, à voir plus tard par Splasher

  9. #9
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2013
    Messages : 4
    Points : 0
    Points
    0

    Par défaut

    En fait, pour le traitement de ma base, j'identifie plusieurs étapes de nettoyage :

    - Enlever les doublons parfait.
    - Enlever les doublons en perte d'information.
    - Fusionner les lignes pour prendre le l'information éparpiller.
    - Enlever les similaires avec un Algo style levenshtein.

    L'étape des doublons parfait est déjà faite.
    J'essaye de faire celle des doublons en perte d'information.

    Je vais essayer le script de Rei Ichido en l'adaptant a ma base

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •