我在以下聚合中突破了我的头脑。我想获得普通设备在日期x和y之间检查的不同页面的数量。
模型的伪代码:
class Statistic:
device_id = int
date = date
page_id = int
任何人都知道如何完成此任务:
Statistic.objects.filter(date__gte=x,date__lte=y).???
更新:如果问题不明确,这是一个例子:
但这涉及循环中的查询,每个device_id的新查询,这显然不是很有效。我正在寻找一种方法来做1-2次查询。
答案 0 :(得分:1)
Statistic.objects.filter(date__gte=x, date__lte=y).distinct('device_id', 'page_id').values('device_id', 'page_id')
将为您提供Queryset,显示设备访问过一次的页面,清楚地(以独特的方式)并且只检索您想要的数据。
然后你可以用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'])
然后,您在Python dict中拥有page_id
访问过的所有唯一deviced_id
,您可以随意执行任何操作。
由于您提供的模型似乎与其他模型无关,我不知道我们是否可以更好地优化Queryset来做数据库端,这很难实现。
答案 1 :(得分:0)
如果我正确理解您的问题,您希望获得每个设备在x和y日期之间检查的平均页数,
为此你需要找到许多独特的设备,你可以这样做:
pages = Statistic.objects.filter(date__gte=x,date__lte=y).count()
avg_pages_per_device = pages/devices
现在找到此范围内的对象数量:
(function() {
function getLabelStrForIndPlan(ind, plan) {
if (ind === 'Y' && plan === 'State') {
return 'yes';
}
else if (ind === 'N' && plan === 'Another State') {
return 'no';
}
}
function abc(Input){
return function(value){
for(var i=0; i<3; i++){
var fpwInd = Input[i].fpwInd;
var label = getLabelStrForIndPlan(fpwInd, fpw.plan);
if (label) {
fpwValues.push(weblService.returnLabel(label, $rootScope.label));
break;
}
}
}
}
})();
答案 2 :(得分:0)
If I'm thinkin clear, this should do it:
Statistic.objects.filter(date__gte=x,date__lte=y).values('device_id').annotate(count=Count('device_id')).aggregate(avg=Avg('count'))