PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Was ist der richtige Weg, um mit SqlAlchemy „distinct on“ (Postgres) zu verwenden?

Was Sie zu suchen scheinen, ist der DISTINCT ON ... ORDER BY Redewendung in Postgresql für die Auswahl von Ergebnisse (N =1 ). Anstatt also nur zu gruppieren und zu aggregieren

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

Dadurch werden nach Namen "gruppierte" Zeilen mit dem größten Zeitstempelwert ausgewählt.

Sie möchten das Sternchen die meiste Zeit nicht verwenden, jedenfalls nicht in Ihrem Anwendungscode, es sei denn, Sie führen manuelle Ad-hoc-Abfragen durch. Das Sternchen ist im Grunde "alle Spalten aus dem FROM table/relation", was später Ihre Annahmen brechen könnte, wenn Sie Spalten hinzufügen, sie neu anordnen und so weiter.

Falls Sie die resultierenden Zeilen basierend auf dem Zeitstempel im Endergebnis sortieren möchten, können Sie beispielsweise Query.from_self() um die Abfrage in eine Unterabfrage umzuwandeln und in der einschließenden Abfrage zu bestellen:

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()