首页 > 解决方案 > Django ORM按日期从日期时间分组,分组聚合

问题描述

我有一个表,我想先做一个grouping by,然后将这些组聚合成一些值。所以...

表“统计

| owner_id | created_at | views | clicks | ... other numbers

当我这样做时,我想得到什么:

    Statistic.objects.filter(
        owner_id=X
    ).annotate(
        day=Cast('created_at', DateField())
    ).values(
        'day'
    ).annotate(
        models.Avg('views')
    )

... 是list一个数据按datecreated_atDateTime字段)转换分组的数据和聚合值,如平均查看次数或点击次数等...

问题是 django 添加了group by "statistic"."created_at",这违反了我的要求。我曾尝试运行原始 SQL 查询,但不幸的是,它还需要按 created_at 分组。

请帮助我,解释为什么需要这样做,以及如何解决我的任务?

标签: sqlgroup-bydjango-orm

解决方案


TruncDate您可以使用表达式 [Django-doc]截断日期:

from django.db.models import Avg
from django.db.models.functions import TruncDate

Statistic.objects.filter(
        owner_id=X
).values(
    date=TruncDate('created_at')
).annotate(
    Avg('views')
).order_by('date')

推荐阅读