使用 Django Query 总结期间每一天的最大值
Sum greatest values of each day from period with Django Query
我的项目有一个模型如下:
class Data(Model):
data = FloatField(verbose_name='Data', null=True, blank=True)
created_at = DateTimeField(verbose_name='Created at')
而且我的应用程序每天创建数百个此模型的日志。
我试图只对每天的最大值求和,而不必迭代它们(仅使用 Django 查询)。
是否可以不写 SQL 个查询?
PS:我能够得到每天最大的'data',所以当前的逻辑在几天内迭代并对每天的最大值求和。但是这个解决方案变得太慢了,我想直接解决它到数据库级别。
如果您使用的数据库支持 distinct
字段(就像 postgres 一样),您可以这样做。
Data.objects.order_by('created_at__date', '-data').distinct('created_at__date')
救援的注释和聚合:
from django.db.models import Sum, Max
from django.db.models.functions import Trunc
report = (Data.objects
.annotate(day=Trunc('created_at', 'day'))
.values('day')
.annotate(greatest=Max('data'))
.values('greatest')
.aggregate(total=Sum('greatest'))
)
print(report['total'])
结果SQL几乎比代码简单:
SELECT SUM("greatest")
FROM
(SELECT MAX("app_data"."data_id") AS "greatest"
FROM "app_data"
GROUP BY DATE_TRUNC('day', "app_data"."created_at")) subquery
我的项目有一个模型如下:
class Data(Model):
data = FloatField(verbose_name='Data', null=True, blank=True)
created_at = DateTimeField(verbose_name='Created at')
而且我的应用程序每天创建数百个此模型的日志。
我试图只对每天的最大值求和,而不必迭代它们(仅使用 Django 查询)。
是否可以不写 SQL 个查询?
PS:我能够得到每天最大的'data',所以当前的逻辑在几天内迭代并对每天的最大值求和。但是这个解决方案变得太慢了,我想直接解决它到数据库级别。
如果您使用的数据库支持 distinct
字段(就像 postgres 一样),您可以这样做。
Data.objects.order_by('created_at__date', '-data').distinct('created_at__date')
救援的注释和聚合:
from django.db.models import Sum, Max
from django.db.models.functions import Trunc
report = (Data.objects
.annotate(day=Trunc('created_at', 'day'))
.values('day')
.annotate(greatest=Max('data'))
.values('greatest')
.aggregate(total=Sum('greatest'))
)
print(report['total'])
结果SQL几乎比代码简单:
SELECT SUM("greatest")
FROM
(SELECT MAX("app_data"."data_id") AS "greatest"
FROM "app_data"
GROUP BY DATE_TRUNC('day', "app_data"."created_at")) subquery