Bonjour tout le monde
Je cherche a faire un peu d'analyse de donnees sur mes tables, et je commence a tomber sur des cas assez recurrents qui me posent probleme.
Admettons que j'ai 3 tables.
Une table "community" avec 1 colonne "id" et d'autres attributs
Une table "user", de meme.
Une table "community_user" qui me modelise la relation ManyToMany entre les deux.
Si je veux par exemple le nombre de moins de 30 ans par communaute, pas de soucis
select community_id, count(user_id) from community_user, user where id=user_id and age<30 group by community_id
Par contre, comment les choses se passent si je veux calculer plusieurs aggregats avec des filtres differents. Disons renvoyer le nombre de moins de 18 ans et de plus de 60 ans dans la meme requete.
J'avais commence quelque chose avec des clauses select imbriquees dans mon from, mais je me suis vite rendu compte que mon extraction commencait apres que ces select aient ete faits en integralite. Si je rajoute un limit 10 a la fin par exemple, je dois quand meme patienter jusqu'a la fin des select.
Ainsi,
1 2 3 4
| select community_id, c1, c2 from
(select community_id, count(user_id) as "c1" from community_user group by community_id) as "q1",
(select community_id, count(user_id) as "c2" from community_user, user where id=user_id and age<30 group by community_id) as "q2"
where q1.community_id=q2.community_id |
semble vraiment inefficace !
Y a-t'il une meilleure methode pour faire cela ?
Le SELECT CASE n'est pas satisfaisant, parce que les filtres que je veux appliquer ne sont pas forcement disjoints.
Les Window Functions (je suis sous Postgresql) m'ont ete recommandees, mais je ne vois pas du tout comment elles peuvent m'aider...
Les UNION ne me semblent pas tres "propres" dans ce cas, compare aux jointures (mais vu ce que j'y connais...)
Partager