如何使用 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))
这是我的。
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))