Agrupar por y función de conteo en sqlalchemy

Respuestas:

165

La documentación sobre el conteo dice que para group_byconsultas es mejor usar func.count():

from sqlalchemy import func
session.query(Table.column, func.count(Table.column)).group_by(Table.column).all()
miniwark
fuente
16
y aquí está la declaración completa para aquellos que usan la Table.querypropiedad en lugar de session.query():Table.query.with_entities(Table.column, func.count(Table.column)).group_by(Table.column).all()
Jakub Kukul
2
@jkukul Esta debería ser una respuesta por sí sola: siempre me pregunté cómo sortear esta limitación al hacer subconsultas y quería usar group_by y count ...!
chris-sc
1
Las modificaciones a esta respuesta hacen que la primera oración carezca de sentido. ¿"Mejor" que qué ?
Mark Amery
33

Si está utilizando Table.querypropiedad:

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

Si está utilizando el session.query()método (como se indica en la respuesta de miniwark):

from sqlalchemy import func
session.query(Table.column, func.count(Table.column)).group_by(Table.column).all()
Jakub Kukul
fuente
+ uno para con entidades
Espoir Murhabazi
27

También puede contar con varios grupos y su intersección:

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

La consulta anterior devolverá recuentos de todas las posibles combinaciones de valores de ambas columnas.

fccoelho
fuente
Gracias por la pregunta, mientras pensaba en ello encontré una respuesta a una pregunta mía relacionada. ;-)
fccoelho