sql >> Databasteknik >  >> RDS >> PostgreSQL

Beräkna Max av summan av ett kommenterat fält över en grupperad efter fråga i Django ORM?

Du kan inte göra en aggregering av en aggregerad Max(Sum()) , det är inte giltigt i SQL, oavsett om du använder ORM eller inte. Istället måste du ansluta bordet till sig själv för att hitta maximalt. Du kan göra detta med hjälp av en underfråga. Koden nedan ser rätt ut för mig, men kom ihåg att jag inte har något att köra det här på, så det kanske inte är perfekt.

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

Detta bör generera SQL som:

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

Det kan vara mer effektivt att eliminera kopplingen i Subquery genom att använda en backend-specifik funktion som array_agg (Postgres) eller GroupConcat (MySQL) för att samla in Relation.ids som är grupperade i den yttre frågan. Men jag vet inte vilken backend du använder.



  1. mysql_fetch_array() förväntar sig att parameter 1 är ett resursproblem

  2. När körs SQLiteOpenHelper onCreate() / onUpgrade()?

  3. Skillnad mellan Oracles plus (+) notation och ansi JOIN notation?

  4. Oracle-databasen hänger oändligt i UPDATE-frågor