如何使用 PostgreSQL 计算数组元素的总和

How to calculate sum of array elements using PostgreSQL

这是我的。

class Array(Subquery):
    template = 'ARRAY(%(subquery)s)'

class A(models.Model):
    ...

class B(models.Model):
    a = models.ForeignKey(A)

class C(models.Model):
    b = models.ForeignKey(B)

b_sub = B.objects.filter(a=OuterRef('pk').annotate(items=Count('c').values('items')

result = a.objects.annotate(items=Array(b_sub))

我得到

# >>> result.first().items
[4, 6, 10]

但我需要每个 A 行的所有 items(4+6+10)->20 的总和。

像这样

# >>> result.first().items
20

可能吗?

不确定,理解正确或不正确你的问题 但是 sql 查询呢,像这样:

SELECT ID, (SELECT SUM(A) FROM UNNEST(MY_COLUMN) AS A) AS TOTAL FROM MY_TABLE;

像这样:

from django.db.models import Sum
result = a.objects.annotate(items=Array(b_sub)).aggregate(Sum(items))

解决方法如下

class SubqueryCount(Subquery):
    template = '(SELECT count(*) FROM (%(subquery)s) _count)'
    output_field = IntegerField()


sub = C.objects.filter(b__a=OuterRef('pk')).only('pk')
result = a.objects.annotate(count=SubqueryCount(sub))