Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Outils
Outils Forum d'entraide sur les outils pour MySQL. Avant de poster -> Outils MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/02/2007, 16h13   #1
Membre actif
 
Inscription : janvier 2006
Messages : 389
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : janvier 2006
Messages : 389
Points : 152
Points : 152
Envoyer un message via MSN à dragonfly
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...
dragonfly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 20h05   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
l'idée de base va être de générer un n° d'ordre pour chaque client dans chaque pays :

Code :
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
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 10h43   #3
Membre actif
 
Inscription : janvier 2006
Messages : 389
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : janvier 2006
Messages : 389
Points : 152
Points : 152
Envoyer un message via MSN à dragonfly
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 :
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 :
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
dragonfly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 12h15   #4
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Désolé, j'ai une fâcheuse tendance à oublier les GROUP BY... J'ai corrigé ma réponse ci-dessus.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 12h23   #5
Membre actif
 
Inscription : janvier 2006
Messages : 389
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : janvier 2006
Messages : 389
Points : 152
Points : 152
Envoyer un message via MSN à dragonfly
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
dragonfly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 12h31   #6
Membre actif
 
Inscription : janvier 2006
Messages : 389
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : janvier 2006
Messages : 389
Points : 152
Points : 152
Envoyer un message via MSN à dragonfly
Re

J'ai testé ta requéte avec mes paramétres =>
Code :
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 :
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...
dragonfly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 13h34   #7
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
le COUNT(*) te renvoie le nb de lignes précédentes, donc le rang de classement.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 13h51   #8
Membre actif
 
Inscription : janvier 2006
Messages : 389
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : janvier 2006
Messages : 389
Points : 152
Points : 152
Envoyer un message via MSN à dragonfly
OK OK mais....

Comment cela se fait-il que les nombres augmentent puis diminue puis réaugmentent,....

C'est ca que je pige pas en fait ...

dragonfly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2007, 17h37   #9
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
il faut que tu mettes les mêmes filtres sur d2, sinon ça fait plein de lignes en + qui sont COUNTées.
Code :
1
2
3
  AND d2.Test=0 
AND d2.Terminate='success'
AND d2.StateID=-2
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h27.


 
 
 
 
Partenaires

Hébergement Web