首页 > 解决方案 > Django 在 GROUP BY 子句中添加了一个额外的字段

问题描述

这是一个查询:

speed_by_computer = ChartPoint.objects.filter(
    date__gte=start,
    date__lt=end,
).values('computer_id') \
 .annotate(max_speed=Max('speed'))

这是此查询生成的 SQL 查询:

SELECT "computer_id", MAX("speed") AS "max_speed" 
FROM "api_chartpoint" 
WHERE (
    "date" >= 2018-05-17 08:00:00+00:00 AND 
    "date" < 2018-05-17 09:00:00+00:00
) 
GROUP BY "computer_id", "date" 
ORDER BY "date" DESC

date请注意,GROUP BY子句中有意外。为什么会在这里?这是我的预期:

SELECT "computer_id", MAX("speed") AS "max_speed" 
FROM "api_chartpoint" 
WHERE (
    "date" >= 2018-05-17 08:00:00+00:00 AND
    "date" < 2018-05-17 09:00:00+00:00
) 
GROUP BY "computer_id"

标签: djangodjango-modelsdjango-orm

解决方案


问题出在默认排序中。它被指定在Meta

class ChartPoint(models.Model)
    ...
    class Meta:
       ordering = ['-date']

删除排序并且date不会被添加到GROUP BY

speed_by_computer = ChartPoint.objects.filter(
    date__gte=start,
    date__lt=end,
).values('computer_id') \
 .annotate(hs_avg=Max('speed'))
 .order_by()

推荐阅读