Django聚合查询生成SQL错误

时间:2010-04-23 10:44:22

标签: sql-server django

我正在使用最新的sqlserver_ado库在SQL Server 2005数据库上使用Django 1.1.1。

models.py包括:

class Project(models.Model):
    name = models.CharField(max_length=50)

class Thing(models.Model):
    project = models.ForeignKey(Project)
    reference = models.CharField(max_length=50)

class ThingMonth(models.Model):
    thing = models.ForeignKey(Thing)
    timestamp = models.DateTimeField()
    ThingMonthValue = models.FloatField()

    class Meta:
        db_table = u'ThingMonthSummary'

在视图中,我检索了一个名为“things”的查询集,其中包含25件事:

things = Thing.objects.select_related().filter(project=1).order_by('reference')

然后,我想要进行聚合查询,以获得特定时期内前20个事物的平均ThingMonthValue,以及最后5个相同的值。

对于我做的前20个:

averageThingMonthValue = ThingMonth.objects.filter(thing__in=things[:20],timestamp__range="2009-01-01 00:00","2010-03-00:00")).aggregate(Avg('ThingMonthValue'))['ThingMonthValue__avg']

这样可以正常工作,并返回所需的值。

在过去的5场比赛中我做到了:

averageThingMonthValue = ThingMonth.objects.filter(thing__in=things[20:],timestamp__range="2009-01-01 00:00","2010-03-00:00")).aggregate(Avg('ThingMonthValue'))['ThingMonthValue__avg']

但是为此我得到一个SQL错误:'当EXISTS没有引入子查询时,只能在选择列表中指定一个表达式。'

django使用的SQL查询读取:

SELECT AVG([ThingMonthSummary].[ThingMonthValue]) AS [ThingMonthValue__avg] 
FROM [ThingMonthSummary] 
WHERE ([ThingMonthSummary].[thing_id] IN
     (SELECT _row_num, [id] FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY [AAAA].[id] ASC) as _row_num,
     [AAAA].[id] FROM ( SELECT U0.[id] FROM [Thing] U0 WHERE U0.[project_id] = 1 ) AS [AAAA]) as QQQ
     where 20 < _row_num) AND [ThingMonthSummary].[timestamp] BETWEEN '01/01/09 00:00:00' and '03/01/10 00:00:00')

任何想法为什么它适用于一片事而不是第二片?我已经检查过,这两个切片确实包含了所需的东西。

1 个答案:

答案 0 :(得分:2)

这看起来像是Django ORM的SQL生成器中的一个错误。生成的SQL在第二个查询的_row_num子查询中返回id以及IN(如果不需要)。

前20个计算不需要这个,因为子查询可以写成SELECT TOP 20...

要解决最后 n 行计算问题,您可以返回未聚合的Things集合,并在代码中执行平均计算。

(可能有另一个特定于Django的解决方案,但我是一个SQL服务器人员。)