sql >> Databáze >  >> RDS >> PostgreSQL

Vypočítat max. součtu anotovaného pole nad seskupeným dotazem v Django ORM?

Nemůžete vytvořit souhrn souhrnu Max(Sum()) , není platný v SQL, ať už používáte ORM nebo ne. Místo toho se musíte připojit ke stolu k sobě, abyste našli maximum. To lze provést pomocí dílčího dotazu. Níže uvedený kód se mi zdá správný, ale mějte na paměti, že to nemám na čem spustit, takže to nemusí být dokonalé.

from django.db.models import Subquery, OuterRef

annotation = {
    'AcSum': Sum('intensity')
}
# The basic query is on Relation grouped by A and Category, annotated
# with the Sum of intensity
query = Relation.objects.values('a', 'b__category').annotate(**annotation)

# The subquery is joined to the outerquery on the Category
sub_filter = Q(b__category=OuterRef('b__category'))
# The subquery is grouped by A and Category and annotated with the Sum
# of intensity, which is then ordered descending so that when a LIMIT 1
# is applied, you get the Max.
subquery = Relation.objects.filter(sub_filter).values(
    'a', 'b__category').annotate(**annotation).order_by(
    '-AcSum').values('AcSum')[:1]

query = query.annotate(max_intensity=Subquery(subquery))

To by mělo vygenerovat SQL jako:

SELECT a_id, category_id,
       (SELECT SUM(U0.intensity) AS AcSum
        FROM RELATION U0
        JOIN B U1 on U0.b_id = U1.id
        WHERE U1.category_id = B.category_id
        GROUP BY U0.a_id, U1.category_id
        ORDER BY SUM(U0.intensity) DESC
        LIMIT 1
       ) AS max_intensity
FROM Relation
JOIN B on Relation.b_id = B.id
GROUP BY Relation.a_id, B.category_id

Může být výkonnější odstranit spojení v Subquery pomocí specifické funkce backendu, jako je array_agg (Postgres) nebo GroupConcat (MySQL) ke shromažďování Relation.ids které jsou seskupeny ve vnějším dotazu. Ale nevím, jaký backend používáte.



  1. Vrácení uložených procedur a funkcí v databázi SQL Server:ROUTINES (příklady T-SQL)

  2. Jak mohu určit nainstalované instance SQL Server a jejich verze?

  3. Mýty o výkonu:Nadměrná velikost sloupců řetězců

  4. Jak zrušit více intervalových oddílů na základě data?