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

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    avril 2004
    Messages
    346
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 346
    Points : 432
    Points
    432

    Par défaut Choix entre group by ou over partition

    Bonjour,

    Le but est de connaître les n-uplons selon un champ et récupérer un id, le login de l'utilisateur et le nombre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT sub.id, sub.login, sub.nb
    FROM (SELECT id, login, COUNT(*) OVER(PARTITION BY id) AS nb
          FROM utilisateur u) AS sub
    WHERE nb > 1;
    ou avec cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    WITH n as (
        SELECT id, COUNT(id) AS nb
            FROM utilisateur u
            GROUP BY id
            HAVING COUNT(id) > 1
    )
    SELECT u.id, u.login, n.nb from UTILISATEUR u
        JOIN n ON u.id_ref = n.id_ref
    Il y a quelques environ 40.000 lignes et 2000 lignes en doublons avec le même id.
    Quelle méthode faudrait-il choisir ? J'ai regardé le plan d'exécution qui est différent mais les performances sont proches. La deuxième solution étant un peu plus rapide (5%).

    Il existe peut-être une autre solution plus adaptée pour résoudre ce problème.

    Merci de vos lumières

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Amateur
    Inscrit en
    février 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Amateur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2017
    Messages : 30
    Points : 39
    Points
    39

    Par défaut

    Bonjour.

    Avec cette requête ça donne quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT id
         , login
         , COUNT(1) AS nb
      FROM utilisateur
    GROUP BY id
           , login
    HAVING COUNT(1) > 1

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    avril 2004
    Messages
    346
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 346
    Points : 432
    Points
    432

    Par défaut

    Désolé du délai de réponse.
    Ta solution proposée pose problème car deux logins peuvent avoir le même id or là on groupe sur le couple.
    Le but est de sortir les logins (quand ils sont sur un nombre > 1) qui partagent le même id.

  4. #4
    Modérateur

    Homme Profil pro
    Consultant Teradata
    Inscrit en
    septembre 2008
    Messages
    7 810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Teradata

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 810
    Points : 15 443
    Points
    15 443

    Par défaut

    La première méthode ne fait qu'un seul accès à la table utilisateur, la seconde a le bon goût de bien filtrer les données utiles (je suppose que vous avez un index sur Utilisateur.Id).
    C'est vraiment le ratio doublons / total (ici 5%) qui fait qu'une requête sera plus rapide que l'autre.
    Si votre taux reste stable ou tend vers 0, la seconde syntaxe sera à privilégier.
    Si ce taux croît, il y a un moment où la première syntaxe sera préférable.

    En l'état actuel compte-tenu du volume, c'est un faux problème, mais c'est très bien que vous vous posiez la question.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/07/2010, 15h28
  2. a href : choix entre OUVRIR ou TELECHARGER
    Par lepierre dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 21/06/2005, 14h51
  3. choix entre dbexpress et objet interbase
    Par hani dans le forum Bases de données
    Réponses: 5
    Dernier message: 18/11/2004, 23h09
  4. Conseille Choix entre MySQL et InterBase?
    Par Redhouane dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/09/2004, 11h42
  5. choix entre macro et fonction
    Par remi77 dans le forum C
    Réponses: 4
    Dernier message: 22/10/2003, 14h26

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