|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : septembre 2007 Messages : 6 ![]() |
Bonjour,
Je suis confronté à une problématique de "distribution statistique" que j'aimerais résoudre avec une requête SQL. Je travaille sur des réseaux sociaux, et je souhaite compter le nombre d'amis de chacun de mes utilisateurs. Ce que je sais faire : - ramener le nombre d'amis pour chacun de mes utilisateurs - ramener le nombre d'utilisateurs ayant 1, 2, ... amis - ramener le nombre total d'utilisateurs ayant des amis Ce que je souhaite faire : - ramener le nombre d'amis (en X) et la répartition en % par rapport au total de mes utilisateurs (en Y) => exemple Ma requête actuelle : Code :
Merci par avance ! :o) |
||
|
|
00
|
|
|
#2 | ||
![]() ![]() |
Comme ça ?
Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#3 | ||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 646 ![]() |
hmm attention Cinéphil, ceci est une requête scalaire (edit : remarque vu la répartition .... ca ne sera pas un problème)
Il vaudrai mieux prendre une option de jointure cartésiène pour ce problème je pense. Vu que me MySql ne supporte pas le cross join .. Code :
|
||
|
|
00
|
|
|
#4 | |
![]() ![]() |
Euh... il me semble avoir répondu à ça :
Citation:
Dans ta requête comme dans la mienne : Code :
SELECT COUNT(*) AS nb_tot FROM utilisateurs Demander dans ta requête le max(nb_tot) donnera toujours le même nombre ! J'ai donc l'impression que ta requête donne le même résultat que la mienne mais avec une jointure inutile.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Salut !
D'après ton graphique, tu veux une somme cumulative, donc pour mois il y a deux étapes : - Grouper le nombre d'utilisateurs par nombre d'amis - Sommer pour chaque nombre d'amis le pourcentage de gens qui ont autant ou moins. Sans fonctions analytiques, ça donne un truc du genre : Code :
(Sur Oracle je parierais que non)
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
||
|
00
|
|
|
#6 |
|
Membre émérite
![]() Olivier DehorterIngenieur de recherche - Ecologue Inscription : juin 2003 Messages : 698 ![]() |
Pour faire une digression (sur le plan statistique), le terme de distribution statistique est incorrect.
La distribution statistique est le représentation des données sous forme graphique pour vérifier quelle suit une loi statistique (gauss, Poisson, etc) - pour faire simple -
|
|
|
10
|
|
|
#7 | |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 646 ![]() |
Citation:
le trip c'est qu'ici il n'y a qu'un "select count(*) from ma_table" sans référence à l'autre table ... du coup ... edit: je ne peux pas tester sur MySql, mais sur 2 autres sgbd ca passe sasn problème. Donc je suppose que la solution de Cinephil est mieux (je parle de la technique utilisée pas de la requête à fournir pour résoudre le problème initiale) |
|
|
|
00
|
|
|
#8 | |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Citation:
La répartition d'une population par modalité, et la version cumulative, c'est la version discrète de ce que tu obtiens en intégrant la loi de probabilité... En tous cas, le terme de distribution s'applique bien ici. Après, c'est le mot statistique que tu n'aimes pas ?
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
|
00
|
|
|
#9 | |
|
Membre émérite
![]() Olivier DehorterIngenieur de recherche - Ecologue Inscription : juin 2003 Messages : 698 ![]() |
Citation:
Sur le plan SQL, je ne suis pas très au point dessus; mais les CTE pourraient être utile dans ce contexte (si elles sont implémentées dans MySql ?) |
|
|
|
00
|
|
|
#10 |
![]() ![]() |
Eh non ! Pas de récursif chez MySQL !
Je n'ai pas regardé la requête de Pacman en détail mais j'ai l'impression que ce sera plus rapide de récupérer le paquet de données de ma requête puis de traiter la cumulation dans le langage de programmation en même temps que la construction du graphique.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#11 | ||
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Oui s'il y a des problèmes de perf, c'est sûrement ce qu'il y a de mieux à faire... ou alors passer par une table temporaire (toujours pas aussi rapide qu'un traitement itératif sur le premier résultset, mais une fois l'aggrégat enregistré, la requête doit être beaucoup plus légère).
Olivier, la CTE aurait été utile uniquement sous Oracle, parce qu'elle permet la matérialisation du résultat (c'est à dire la mise en table temporaire "système"). Mais avant de reprocher ça à MySQL, je reprocherais plutôt l'absence de fonctions analytique qui auraient certainement permis d'écrire le résultat très différemment ! (et plus rapidement bien sûr Par exemple sous Oracle : Code :
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
||
|
00
|
Copyright © 2000-2012 - www.developpez.com