PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Qual è il modo corretto di usare distinto su (Postgres) con SqlAlchemy?

Quello che sembra che tu stia cercando è il DISTINCT ON ... ORDER BY idioma in Postgresql per selezionare risultati (N =1 ). Quindi, invece di raggruppare e aggregare solo

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

Questo finirà per selezionare le righe "raggruppate" per nome, con il valore di timestamp maggiore.

Non si desidera utilizzare l'asterisco per la maggior parte del tempo, comunque non nel codice dell'applicazione, a meno che non si eseguano query manuali ad hoc. L'asterisco è fondamentalmente "tutte le colonne da FROM tabella/relazione", che potrebbe quindi infrangere le tue ipotesi in seguito, se aggiungi colonne, le riordini e così via.

Nel caso in cui desideri ordinare le righe risultanti in base al timestamp nel risultato finale, puoi utilizzare ad esempio Query.from_self() per trasformare la query in una sottoquery e ordinare nella query che la racchiude:

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