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

时间:2018-11-26 14:02:58

标签: python django django-orm

这就是我所拥有的。

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]

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

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

有可能吗?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

类似这样的东西:

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

答案 2 :(得分:0)

以下为解决方案

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