Grouper des données et calculer des statistiques#
Les fonctions d'agrégat dans PostgreSQL
Valeurs distinctes d'un champ#
On souhaite récupérer toutes les valeurs possibles d'un champ
1 2 3 4 5 6 7 8 9 |
|
Regrouper des données en spécifiant les champs de regroupement#
Certains calculs nécessitent le regroupement de lignes, comme les moyennes, les sommes ou les totaux. Pour cela, il faut réaliser un regroupement via la clause GROUP BY
Compter les communes par département et calculer la population totale
1 2 3 4 5 6 7 8 9 |
|
Calculer des statistiques sur l'aire des communes pour chaque département
1 2 3 4 5 6 7 8 |
|
Compter le nombre de routes par nature
1 2 3 4 5 6 |
|
Compter le nombre de routes par nature et par sens
1 2 3 4 5 |
|
Les caculs sur des ensembles groupés peuvent aussi être réalisé sur les géométries.. Les plus utilisés sont
ST_Collect
qui regroupe les géométries dans une multi-géométrie,ST_Union
qui fusionne les géométries.
Par exemple, on peut souhaiter trouver l'enveloppe convexe autour de points (élastique tendu autour d'un groupe de points). Ici, nous regroupons les lieux-dits par nature (ce qui n'a pas beaucoup de sens, mais c'est pour l'exemple). Dans ce cas, il faut faire une sous-requête pour filtrer seulement les résultats de type polygone (car s'il y a seulement 1 ou 2 objets par nature, alors on ne peut créer de polygone)
1 2 3 4 5 6 7 8 9 10 11 |
|
Attention, on doit donner un alias à la sous-requête (ici source
)
Un autre exemple sur les bornes. Ici, on groupe les bornes par identifiant pair ou impair, et on calcule l'enveloppe convexe
1 2 3 4 |
|
On peut réaliser l'équivalent d'un DISSOLVE
de QGIS en regroupant les géométries via ST_Union
. Par exemple fusionner l'ensemble des communes pour construire les géométries des départements:
1 2 3 4 5 6 7 8 9 |
|
Attention, cette requête est lourde, et devra être enregistrée comme une table.
Filtrer sur les regroupements#
Si on souhaite compter les communes par département, calculer la population totale et aussi filter celles qui ont plus de 500 000 habitants, il peut paraître logique d'écrire cette requête :
1 2 3 4 5 6 7 |
|
ou bien encore :
1 2 3 4 5 6 7 |
|
Ces deux requêtes renvoient une erreur. La bonne requête est :
1 2 3 4 5 6 7 |
|
Il faut savoir que la clause WHERE
est exécutée avant la clause GROUP BY
, il n'est donc pas possible de filtrer sur des regroupements avec celle-ci. C'est le rôle de la clause HAVING
.
Aussi la clause SELECT
est exécutée après les clauses WHERE
et HAVING
, il n'est donc pas possible d'utiliser des alias déclarés avec celle-ci.
Un schéma illustrant ceci est disponible sur le site postgresqltutorial.com.
Continuer vers Rassembler des données: UNION ALL
Quiz#
Écrire une requête retournant, pour le/les département(s) dont la population moyenne des villes est supérieure ou égale à 1500 habitants, le nom du/des département(s) ainsi que cette moyenne.
1 2 3 4 5 |
|
Écrire une requête retournant pour les départements 'SEINE-MARITIME' et 'EURE', leur nom, le nombre de communes ainsi que la surface et la surface de l'enveloppe convexe en mètre carré sous forme d'entier.
1 2 3 4 5 6 7 |
|