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

Да се ​​изчисли максималната сума на анотирано поле върху групирано по заявка в Django ORM?

Не можете да направите обобщение на агрегат Max(Sum()) , не е валидно в SQL, независимо дали използвате ORM или не. Вместо това трябва да присъедините таблицата към себе си, за да намерите максимума. Можете да направите това с помощта на подзаявка. Кодът по-долу ми изглежда правилен, но имайте предвид, че нямам какво да стартирам това, така че може да не е перфектен.

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

Това трябва да генерира SQL като:

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

Може да е по-ефективно да премахнете присъединяването в Subquery като използвате специфична функция за бекенда като array_agg (Postgres) или GroupConcat (MySQL), за да събере Relation.ids които са групирани заедно във външната заявка. Но не знам какъв бекенд използвате.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да се справяте с еволюцията на базата данни на Play Framework 2 в производството

  2. Как да променя колона PG на NULLABLE TRUE?

  3. SELECT или INSERT ред в една команда

  4. Postgresql Drop View

  5. PostgreSQL:проблеми с кодирането на Windows при използване на помощната програма за команден ред psql