sql >> Database >  >> RDS >> PostgreSQL

Wat is de juiste manier om distinct on (Postgres) te gebruiken met SqlAlchemy?

Waar je naar lijkt te zoeken is de DISTINCT ON ... ORDER BY idioom in Postgresql voor het selecteren van resultaten (N =1 ). Dus in plaats van gewoon te groeperen en te aggregeren

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

Dit zal uiteindelijk rijen selecteren die "gegroepeerd" zijn op naam, met de grootste tijdstempelwaarde.

U wilt de asterisk meestal niet gebruiken, in ieder geval niet in uw toepassingscode, tenzij u handmatige ad-hocquery's uitvoert. De asterisk is in feite "alle kolommen van de FROM table/relation", die uw aannames later zou kunnen breken, als u kolommen toevoegt, ze opnieuw ordent, en dergelijke.

Als u de resulterende rijen wilt ordenen op basis van tijdstempel in het uiteindelijke resultaat, kunt u bijvoorbeeld Query.from_self() om de query om te zetten in een subquery en de bijbehorende query in te delen:

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. Hoe bind_result() te gebruiken in plaats van get_result() in php

  2. Negeer dubbele vermeldingen en leg succesvolle vast in DbContext.SaveChanges() in EF Core

  3. Custom ORDER BY om 'de' te negeren

  4. KOLOM WIJZIGEN in orakel - Hoe controleer ik of een kolom nullable is voordat deze op nullable wordt gezet?