2016-05-11 56 views
2

我打破了以下聚合的局限。我想获得平均设备在日期x和y之间检查​​的不同页面数量。对于模型Django聚合:在独特的字段上的平均发生率

伪代码:

class Statistic: 
    device_id = int 
    date = date 
    page_id = int 

任何人都知道如何完成这一点:

Statistic.objects.filter(date__gte=x,date__lte=y).??? 

UPDATE:如果这个问题不明确,这里有一个例子:

  • 获取发生在所有唯一的device_id值表。
  • 对于这些唯一的device_id值中的每一个,请计算表中出现的唯一page_id值的数量。将这些值添加到列表中。
  • 计算该列表的平均值。

但是,这涉及到一个循环中的查询,每个device_id,这显然不是很有效的新查询。我正在寻找一种在1-2个查询中做到这一点的方法。

+0

你是什么意思的“检查”,有没有与其他模型'Device'什么关系? 如果我得到它,你想得到'x'和'y'日期之间的所有统计信息,并聚合知道哪个设备检查它以总结并得到一个平均值? –

+0

这里的日期并不重要。这些是iOS/Android统计信息,device_id是指设备uuid,但可以将其视为user_id。我想知道平均用户访问量有多少页(= distinct page_id)。 – tdma

+0

因此,您希望获得给定device_id的每个统计信息,并且据我所知,您希望知道每个访问过的(每次访问一次)UNIQUE页面的设备访问过多少页。迭代所有设备并获得唯一访问页面的平均值? –

回答

0

如果我在想清楚,这应该这样做:

Statistic.objects.filter(date__gte=x,date__lte=y).values('device_id').annotate(count=Count('device_id')).aggregate(avg=Avg('count')) 
0

如果我正确理解你的问题,你想要得到的网页x和y日期间的每个设备检查平均数,

对于您需要找到它,你可以不喜欢这种独特的设备数:

devices= Statistic.objects.filter(date__gte=x,date__lte=y).values('device_id').distinct().count() 

现在找对象这个范围内的数量:

pages = Statistic.objects.filter(date__gte=x,date__lte=y).count()  
avg_pages_per_device = pages/devices 
+0

如果我理解正确,那么这个建议的解决方案是不正确的。 – tdma

1

Statistic.objects.filter(date__gte=x, date__lte=y).distinct('device_id', 'page_id').values('device_id', 'page_id')

将为您提供显示按设备访问过的页面的查询集,明确(以独特的方式)并仅检索您想要的数据。

然后你可以使用Python来计算的:

data = Statistic.objects.filter(date__gte=x, date__lte=y).distinct('device_id', 'page_id').values('device_id', 'page_id') 
devices_set = set([d['device_id'] for d in data]) 
grouped = dict([(d, []) for d in devices_set]) 
for d in data: 
    for g in grouped: 
     if d['device_id'] == g: 
      grouped[g].append(d['page_id']) 

然后,您都独一无二page_id在Python字典参观deviced_id,你可以做任何你想要的。

由于您提供的模型似乎与其他模型没有关系,我不知道我们是否可以更好地将Queryset优化到数据库端,这很难实现。

+0

嘿马克西姆,谢谢你的帮助。问题在于它会杀死内存,因为统计数据可能很多。这就是为什么我喜欢在数据库方面做到这一点。 – tdma

+0

然后,你将不得不做一些其他表(模型)加入这些。例如。使device_id是一个ForeignKey(和page_id以及?) –

+0

嗯,或者只是一个带有嵌套查询的原始SQL。在原始SQL中,我没有任何问题表达这一点。 – tdma