我有下表存储操作的日志。覆盖操作是指存储的绝对值,而加和子操作是方差值。覆盖操作就像检查点一样。
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表达式以重新开始。
如果有人可以帮助我,我将不胜感激。
答案 0 :(得分:0)
此查询中不需要Case ... 只需写
Logs.objects.all().annotate(
calculated_total_quantity=Window(
expression=Sum(F('quantity')),
order_by=F('id').asc()
)
)