Django查询以获取先前值的总和

时间:2020-11-05 15:49:14

标签: django postgresql django-queryset window-functions

我有下表存储操作的日志。覆盖操作是指存储的绝对值,而加和子操作是方差值。覆盖操作就像检查点一样。

Id    operation       quantity   
---------------------------------------------------------
1     ADD             10.00 
2     ADD             20.00 
3     OVERRIDE        15.00 
4     SUB            -5.00   
5     SUB            -10.00    

我的目标是通过一个查询获得以下结果

Id    operation       quantity       calculated_total_quantity
---------------------------------------------------------
1     ADD             10.00          10.00
2     ADD             20.00          30.00
3     OVERRIDE        15.00          15.00
4     SUB            -5.00           10.00
5     SUB            -10.00          0.00

我尝试了以下查询


Logs.objects.all().annotate(
   calculated_total_quantity=Case(
        When(operation="OVERRIDE", then=F('quantity')),
        default=Window(
            expression=Sum(F('quantity')),
            order_by=F('id').asc()
        )
    )
)

通过此查询,我得到了错误的结果:

Id    operation       quantity       calculated_total_quantity
---------------------------------------------------------
1     ADD             10.00          10.00
2     ADD             20.00          30.00
3     OVERRIDE        15.00          15.00
4     SUB            -5.00           40.00
5     SUB            -10.00          30.00

我知道错误是由于Sum表达式引起的,所以我的问题是当日志操作为OVERRIDE时是否有任何方法可以重置Sum表达式以重新开始。

如果有人可以帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

此查询中不需要Case ... 只需写

Logs.objects.all().annotate(
   calculated_total_quantity=Window(
            expression=Sum(F('quantity')),
            order_by=F('id').asc()
        )
    )