PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Какъв е правилният начин за използване на distinct on (Postgres) с SqlAlchemy?

Това, което изглежда търсите, е DISTINCT ON ... ORDER BY идиом в Postgresql за избиране на резултати (N =1 ). Така че вместо само групиране и агрегиране

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

Това в крайна сметка ще избере редове, „групирани“ по име, имащи най-голяма стойност на клеймото за време.

Не искате да използвате звездичката през повечето време, във всеки случай не и в кода на приложението си, освен ако не правите ръчни ad hoc заявки. Звездицата е основно „всички колони от FROM таблица/релация", което след това може да наруши вашите предположения по-късно, ако добавите колони, пренаредите ги и други подобни.

В случай, че искате да подредите получените редове въз основа на клеймо за време в крайния резултат, можете да използвате например Query.from_self() за да превърнете заявката в подзаявка и подредете в придружаващата заявка:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Дълго време за връзка с Azure Postgres

  2. Формат на времето на Rails Activerecord/Postgres

  3. Rails 5 form_for с масив от квадратчета за отметка

  4. PostgreSQL и заключване

  5. Как да добавите променлив брой часове към дата в PostgreSQL?