Django查询以获取以前值的总和
下面是存储操作的日志表。覆盖操作是指存储的绝对值,而添加和子操作是方差值。覆盖操作类似于检查点Django查询以获取以前值的总和,django,postgresql,django-queryset,window-functions,Django,Postgresql,Django Queryset,Window Functions,下面是存储操作的日志表。覆盖操作是指存储的绝对值,而添加和子操作是方差值。覆盖操作类似于检查点 Id operation quantity --------------------------------------------------------- 1 ADD 10.00 2 ADD 20.00 3 OVERRIDE 15.00 4 SUB -5
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表达式引起的,所以我的问题是,是否有任何方法可以在重写日志操作时重置Sum表达式以重新启动
如果有人能帮我,我将不胜感激。在这个问题上你不需要案例。。。 简单地写
Logs.objects.all().annotate(
calculated_total_quantity=Window(
expression=Sum(F('quantity')),
order_by=F('id').asc()
)
)
在这个查询中不需要Case。。。 简单地写
Logs.objects.all().annotate(
calculated_total_quantity=Window(
expression=Sum(F('quantity')),
order_by=F('id').asc()
)
)
避免在django中进行复杂的数据库查询。相反,编写一个数据库视图,它只会简化django ORM,当然也会让您的生活更轻松:)避免django中复杂的数据库查询。相反,编写一个数据库视图,它只会简化django ORM,当然也会让您的生活更轻松:)