postgresql 使用Django Subquery作为FROM表或CTE,以便在聚合上有一个窗口?

vnjpjtjt  于 12个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(194)

我正在尝试对组内的成本求和,然后将多个组的累计成本相加。简化:

class Cost(Model):
    year = IntegerField()
    month = IntegerField()
    cost = DecimalField()

个字符
但是我不知道如何用Django的ORM写它:

innerq = Cost.objects.values("year", "month").annotate(month_total=Sum("cost"))


这一切都很好,但如果我这样做:

outerq = innerq.annotate(
    cum_total=Window(
        expression=Sum("month_total"),
        partition_by=[Value(1)],
        order_by=[F("year"), F("month")],
        frame=RowRange(None, 0),  # UNBOUNDED PRECEDING -> CURRENT ROW
    ),
)


我得到一个:
FieldError:无法计算Sum('month_total'):'month_total'是聚合
我如何将查询集innerq强制到子查询中,就像我上面的SQL一样?(我知道Subquery,只是还没有找到在这里应用它的方法。)

p1iqtdky

p1iqtdky1#

我一直在struggling上遇到类似的问题,刚刚发现了django-cte项目,该项目似乎证实了开箱即用的ORM没有所需的支持,并提供了一种使用With的方法。
使用它,我相信你的问题的简化版本可以通过这样的方式解决:

from django_cte import With

class Cost(Model):
    # pre-req!
    objects = CTEManager()
    year = IntegerField()
    month = IntegerField()
    cost = DecimalField()

cte = With(
    Cost.objects
    .values("year", "month", "month_total")
    .annotate(month_total=Sum("cost"))
)

innerq = cte.join(Cost, region=cte.col.year).with_cte(cte)...

字符串
(My用例与您的用例有点不同)。更多信息请参见docs

相关问题