2017-08-19 2 views
0

J'ai une table telle asqlalchemy group_by et de retour pour max

identifier date  value 
A   2017-01-01 2 
A   2017-01-02 1 
A   2017-01-03 7 
B   2017-01-01 2 
B   2017-01-02 7 
B   2017-01-03 3 

Je suis en train de sélectionner la date maximum de chaque identifiant tel que je reçois:

identifier date  value 
A   2017-01-03 7 
B   2017-01-03 3 

merci

+0

Ceci est une question très courante et a généré son propre tag: [tag: most-n-per-group]. Essayez de chercher un peu. Les solutions peuvent être un peu spécifiques à la base de données, alors veuillez au moins fournir cette information. –

+0

@ IljaEverilä J'ai vu ça, mais il n'y avait pas d'équivalent pour sql alchemy (équivalent python) –

+0

Je sais que c'est faux. Voici une solution Postgresql par exemple: https://stackoverflow.com/questions/44069023/sqlalchemy-show-only-latest-result-if-a-join-returns-multiple-results, mais il manquait le tag. Il est également assez simple d'implémenter des solutions SQL simples dans SQLA. –

Répondre

1

Utilisation d'une sous-requête:

SELECT t1.identifier, t1.date, t1.value FROM table t1 
JOIN 
(
    SELECT identifier, MAX(date) maxdate 
    FROM table 
    GROUP BY identifier 
) t2 
ON t1.identifier = t2.identifier AND t1.date = t2.maxdate; 

Dans SQLAlchemy:

from sqlalchemy import func, and_ 

subq = session.query(
    Table.identifier, 
    func.max(Table.date).label('maxdate') 
).group_by(Table.identifier).subquery('t2') 

query = session.query(Table).join(
    subq, 
    and_(
     Table.identifier == subq.c.identifier, 
     Table.date == subq.c.maxdate 
    ) 
) 
+0

fonctionne parfaitement grâce –