2010-04-23 127 views
0

我在使用最新的sqlserver_ado库的SQL Server 2005数据库上使用Django 1.1.1。Django聚合查询生成SQL错误

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' 

在视图中,我已经检索了一个名为“东西”查询集包含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”

的SQL查询中使用Django的写着:

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') 

任何想法,为什么它的工作原理为物联网的一个切片,而不是第二个?我已经检查过,并且两个切片确实包含所需的东西。

回答

2

这看起来像Django ORM的SQL生成器中的错误。当不需要时,生成的SQL将返回_row_num以及第二个查询的IN子查询中的id

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

为了解决这个问题,去年ň行的计算,你可以返回的Things未收集汇总并用代码进行平均计算。

(有可能是另一个Django的具体的解决方案,但我是一个SQL服务器的家伙。)

+0

这基本上是我做了什么,它是丑陋的,但工程。我已经用sqlserver_ado维护者提出了一张票据,希望他们能够解决这个问题。谢谢! – meepmeep 2010-04-23 14:07:01