Fonction Group by & Count dans sqlalchemy

Réponses:

165

La documentation sur le comptage indique que pour les group_byrequêtes, il est préférable d'utiliser func.count():

from sqlalchemy import func
session.query(Table.column, func.count(Table.column)).group_by(Table.column).all()
miniwark
la source
16
et voici la déclaration complète pour ceux qui utilisent la Table.querypropriété au lieu de session.query():Table.query.with_entities(Table.column, func.count(Table.column)).group_by(Table.column).all()
Jakub Kukul
2
@jkukul Cela devrait être une réponse en soi - je me suis toujours demandé comment contourner cette limitation lorsque je faisais des sous-requêtes et je voulais utiliser group_by et count ..!
chris-sc
1
Les modifications apportées à cette réponse rendent la première phrase dénuée de sens. "Mieux" que quoi ?
Mark Amery
33

Si vous utilisez la Table.querypropriété:

from sqlalchemy import func
Table.query.with_entities(Table.column, func.count(Table.column)).group_by(Table.column).all()

Si vous utilisez la session.query()méthode (comme indiqué dans la réponse de miniwark):

from sqlalchemy import func
session.query(Table.column, func.count(Table.column)).group_by(Table.column).all()
Jakub Kukul
la source
+ un pour avec les entités
Espoir Murhabazi
28

Vous pouvez également compter sur plusieurs groupes et leur intersection:

self.session.query(func.count(Table.column1),Table.column1, Table.column2).group_by(Table.column1, Table.column2).all()

La requête ci-dessus renverra des décomptes pour toutes les combinaisons possibles de valeurs des deux colonnes.

fccoelho
la source
Merci pour la question, en y réfléchissant, j'ai trouvé une réponse à une de mes questions connexes. ;-)
fccoelho