sql >> Database >  >> RDS >> PostgreSQL

Bereken Max van de som van een geannoteerd veld over een gegroepeerd op query in Django ORM?

U kunt geen aggregatie maken van een aggregatie Max(Sum()) , het is niet geldig in SQL, of u nu de ORM gebruikt of niet. In plaats daarvan moet je de tafel bij zichzelf voegen om het maximum te vinden. U kunt dit doen met behulp van een subquery. De onderstaande code lijkt me goed, maar onthoud dat ik niets heb om dit op uit te voeren, dus het is misschien niet perfect.

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

Dit zou SQL moeten genereren zoals:

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

Het kan efficiënter zijn om de join in Subquery te elimineren door een backend-specifieke functie te gebruiken, zoals array_agg (Postgres) of GroupConcat (MySQL) om de Relation.ids . te verzamelen die zijn gegroepeerd in de buitenste query. Maar ik weet niet welke backend je gebruikt.



  1. Microsoft Access optimaliseren met SQL Server IndyPass – 21-5-19

  2. Hoe de gekoppelde server voor SQL Server 2008 te maken waar we de database van 2000 en 2005 hebben?

  3. Hoe kan ik een BEFORE-UPDATED-trigger doen met sql-server?

  4. Hoe kan ik verbinding maken met Sql Server vanaf een Mac met PHP PDO?