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

Outils MySQL Discussion :

Calcul de la mediane en MySQL


Sujet :

Outils MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Par défaut Calcul de la mediane en MySQL
    Bonjour à tous,

    je dois pour le boulot calculer la mediane en MySQL en fonction des valeurs d'une table.

    Je m'explique, j'ai une table Duree composé ainsi

    NClient (primaire) int
    Pays varchar
    Temps int

    Je voudrais pouvoir calculer la mediane (en fonction du champ Temps) pour chaque pays mais je ne sais pas comment faire.
    J'ai regardé sur le net mais je pige que dalle.

    Quelqu'un peut m'aider ?
    MERCI

    P.S : Pour calculer la mediane, on prend les valeurs que l'on tri par ordre croissant, on compte le nombre de valeur que l'on divise par 2 (x), puis on prend la x éme valeur...

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 290
    Par défaut
    l'idée de base va être de générer un n° d'ordre pour chaque client dans chaque pays :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT d1.nclient, d1.temps, COUNT(*) as num
    FROM duree d1
      INNER JOIN duree dz ON d1.pays = d2.pays AND d1.temps >= d2.temps
    GROUP BY d1.nclient, d1.temps
    ensuite tu n'as plus qu'à mettre ça dans une sous-requête et récupérer celui dont le num est MAX(num) / 2.

    EDIT : ajout de la clause GROUP BY

  3. #3
    Membre éclairé Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Par défaut
    Salut et MERCI de ta réponse mais j'ai un petit soucis, j'ai remplacé les champ pour que ca marche bien et voila ce que ca donne avec ta requéte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT d1.N, d1.Duration, COUNT(*) AS num
    FROM Login d1
      INNER JOIN Login d2 ON d1.Country = d2.Country AND d1.Duration >= d2.Duration;
    Sauf qu'il me met une erreur du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
    Test sous MySQL Query Browser.

    Cette erreur disparait-elle si j'injecte cette sous requete dans une requete?

    Sinon comment résoudre ce probléme ?
    MERCI

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 290
    Par défaut
    Désolé, j'ai une fâcheuse tendance à oublier les GROUP BY... J'ai corrigé ma réponse ci-dessus.

  5. #5
    Membre éclairé Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Par défaut
    Par contre j'y pense, il n'y a pas besoin des clients, juste des pays et des durée vu qu'il me faut la mediane de chaque pays en fonction de leurs durée.

    Par contre je galére j'ai essayer d'intégrer ta sous requéte dans une requéte mais (sois je suis mal réveillé sois je suis nul) je ne vois pas comment faire

    Vive le mal de tête...
    HELP

  6. #6
    Membre éclairé Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Par défaut
    Re

    J'ai testé ta requéte avec mes paramétres =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT d1.Country, d1.Duration, count(*) AS num
    FROM Login d1
      INNER JOIN Login d2 ON d1.Country = d2.Country AND d1.Duration >= d2.Duration
      WHERE d1.Test=0 AND d1.Terminate='success' AND d1.StateID=-2
    GROUP BY d1.Country, d1.Duration
    Ca me tri bien les duration en fonction du pays mais le count(*) As num me donne des chiffres assez abhérant du genre
    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
     
    C,D,num
     
    1, 17, 26
    1, 19, 56
    1, 20, 30
    1, 21, 64
    1, 22, 105
    1, 23, 117
    1, 24, 220
    1, 25, 92
    1, 26, 48
    1, 27, 208
    1, 28, 174
    1, 29, 183
    1, 30, 130
    1, 31, 350
    1, 33, 148,.....
    Je ne sais pas trop de ou ca sort tout ces jolies nombre
    En fait je ne sais pas vraiment ce que count(*) doit renvoyer en fait...

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 290
    Par défaut
    le COUNT(*) te renvoie le nb de lignes précédentes, donc le rang de classement.

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

Discussions similaires

  1. [XL-2010] Calcul de la mediane avec critères
    Par Philippe76 dans le forum Excel
    Réponses: 2
    Dernier message: 15/02/2013, 10h55
  2. calcul de la mediane d'un vecteur
    Par karaudrey88 dans le forum R
    Réponses: 2
    Dernier message: 02/04/2012, 13h54
  3. calcul du total en php mysql
    Par sinifer dans le forum Langage
    Réponses: 9
    Dernier message: 15/09/2009, 11h57
  4. [MySQL] Calculs php venant de données MySQL
    Par romeskira dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/09/2008, 16h37
  5. calcul requete MySQL
    Par nestam dans le forum C
    Réponses: 5
    Dernier message: 30/09/2005, 08h40

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