Как рассчитать сумму элементов массива с помощью PostgreSQL - PullRequest
0 голосов
/ 26 ноября 2018

Вот что у меня есть.

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 (4 + 6 + 10) -> 20 для каждой A строки.

Как это

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

Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Примерно так:

from django.db.models import Sum
result = a.objects.annotate(items=Array(b_sub)).aggregate(Sum(items))
0 голосов
/ 06 декабря 2018

Следующее используется для решения

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))
0 голосов
/ 26 ноября 2018

Не уверен, правильно понял или нет вашего вопроса, но как насчет SQL-запроса, например:

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