PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Quelle est la bonne façon d'utiliser distinct on (Postgres) avec SqlAlchemy ?

Ce que vous semblez rechercher est le DISTINCT ON ... ORDER BY idiome dans Postgresql pour sélectionner résultats (N =1 ). Ainsi, au lieu de regrouper et d'agréger simplement

event_list = Table.query.\
    distinct(Table.name).\
    filter_by(**filter_by_query).\
    filter(*queries).\
    order_by(Table.name, Table.timestamp.desc()).\
    all()

Cela finira par sélectionner des lignes "groupées" par nom, ayant la plus grande valeur d'horodatage.

Vous ne voulez pas utiliser l'astérisque la plupart du temps, pas dans votre code d'application de toute façon, à moins que vous ne fassiez des requêtes ad hoc manuelles. L'astérisque est essentiellement "toutes les colonnes de FROM table/relation", ce qui pourrait alors casser vos hypothèses plus tard, si vous ajoutez des colonnes, les réorganisez, etc.

Si vous souhaitez ordonner les lignes résultantes en fonction de l'horodatage dans le résultat final, vous pouvez utiliser par exemple Query.from_self() pour transformer la requête en sous-requête et ordonner dans la requête englobante :

event_list = Table.query.\
    distinct(Table.name).\
    filter_by(**filter_by_query).\
    filter(*queries).\
    order_by(Table.name, Table.timestamp.desc()).\
    from_self().\
    order_by(Table.timestamp.desc()).\
    all()