PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Hitung Maks Jumlah dari bidang beranotasi di atas yang dikelompokkan menurut kueri di Django ORM?

Anda tidak dapat melakukan agregat Max(Sum()) , itu tidak valid dalam SQL, apakah Anda menggunakan ORM atau tidak. Sebagai gantinya, Anda harus bergabung dengan tabel itu sendiri untuk menemukan yang maksimal. Anda dapat melakukan ini menggunakan subquery. Kode di bawah ini terlihat tepat bagi saya, tetapi perlu diingat bahwa saya tidak memiliki sesuatu untuk menjalankan ini, jadi mungkin tidak sempurna.

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

Ini akan menghasilkan SQL seperti:

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

Mungkin lebih efektif untuk menghilangkan gabungan di Subquery dengan menggunakan fitur khusus backend seperti array_agg (Postgres) atau GroupConcat (MySQL) untuk mengumpulkan Relation.ids yang dikelompokkan bersama dalam kueri luar. Tapi saya tidak tahu backend apa yang Anda gunakan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Asinh() Bekerja di PostgreSQL

  2. Blok kode anonim PL/pgSQL

  3. Bagaimana saya bisa mengubah penyandian basis data untuk basis data PostgreSQL menggunakan sql atau phpPgAdmin?

  4. Cara Menyisipkan ke dalam Array di PostgreSQL

  5. Cara memperbarui ID urutan postgreSQL secara massal untuk semua tabel