Django 查询以获取每个月的最佳表现者

问题描述

我需要获取每个月的最佳表现者,这是下面的 MysqL 查询,它为我提供了正确的输出

public function getItem()
{
    try {
        // Some code
        return $result;
    } catch (Exception $e) {
        Log::error($e->getMessage());
        throw new Exception ("$e->getMessage ()",500);
    }
}

我是 Django ORM 的新手。我无法编写完成任务的等效 Django 查询。我已经为这个逻辑苦苦挣扎了 2 天。任何帮助将不胜感激。

解决方法

虽然子查询中的 GROUP BY 子句用 ORM 表达有点困难,因为 aggregate() 操作不发出查询集,但使用 Window 函数可以实现类似的效果:

UserDetail.objects.filter(total_points__in=UserDetail.objects.annotate(max_points=Window(
        expression=Max('total_points'),partition_by=[Trunc('created_datetime','month')]
    )).values('max_points')
)

一般来说,这种模式是用 Subquery expressions 实现的。在本例中,我通过将查询集传递给 __in 谓词来隐式使用子查询。

Django 文档对 using aggregates within subqueries 的注释也与此类查询相关,因为您想在子查询中使用聚合的结果(我已通过使用窗口函数避免了这种情况)。


但是,我相信您的查询可能无法正确捕获您想要执行的操作:如所写,它可能会为给定月份中不是最好的用户返回行,但确实与另一个最好的用户具有相同的分数任何月。