Django:按月份分组后仅统计最新对象

Django:按月份分组后仅统计最新对象,django,postgresql,django-models,Django,Postgresql,Django Models,我正在构建一个基于django的应用程序来收集某个软件用户的统计数据 目标是显示一个图表,显示每个月使用某个版本的用户数 模型如下: 类安装(models.Model): userid=models.IntegerField() 版本=models.CharField(最大长度=25) timestamp=models.DateTimeField(auto_now=True) 其中timestamp是收集用户数据的时间 下面是示例表的外观: | userid | version | times

我正在构建一个基于django的应用程序来收集某个软件用户的统计数据

目标是显示一个图表,显示每个月使用某个版本的用户数

模型如下:

类安装(models.Model):
userid=models.IntegerField()
版本=models.CharField(最大长度=25)
timestamp=models.DateTimeField(auto_now=True)
其中
timestamp
是收集用户数据的时间

下面是示例表的外观:

| userid | version | timestamp |
|------------------------------|
|   1    |  3.1    |<sometime> |
|------------------------------|
|   2    |  3.1    |<sometime> |
|------------------------------|
|   1    |  3.2    |<sometime> |
|------------------------------|
|   3    |  3.1    |<sometime> |
但它有一个问题,即两个版本中会有一个用户。例如,它对
3.1
3.2
两个版本的
userid=1
进行计数,并将使用
version=3.1
的用户的计数返回为3,实际上应该是2

对于每个月,我都希望有一个输出,如果用户更改了他的版本,那么只计算最新提交的版本

上面显示的表的预期查询集应该类似于:

[{'month': datetime.datetime(2019, 7, 1, 0, 0, tzinfo=<UTC>), 'version': 3.1, 'num': 2},
{'month': datetime.datetime(2019, 7, 1, 0, 0, tzinfo=<UTC>), 'version': 3.2, 'num': 1}]
[{'month':datetime.datetime(2019,7,1,0,0,tzinfo=),'version':3.1,'num':2},
{'month':datetime.datetime(2019,7,1,0,0,tzinfo=),'version':3.2,'num':1}]

我注意到这已经有一天多了,没有答案。虽然我不能提供一个直接的解决方案,因为我不会说Django。但也许我可以给你指出正确的方向
您需要的是通过首先按用户消除多个版本来减少计数范围。在DirectSQL中,这可以通过一个子选择来实现,该子选择只返回每个用户的最大版本,外部选择计算结果

-- setup
create table django_count(userid integer, version numeric, dttz timestamp with time zone);
insert into django_count(userid, version, dttz ) 
 values (1, 3.1, now()-interval '1 month')
      , (2, 3.1, now()-interval '1 month' + interval '3 days')
      , (1, 3.2, now()-interval '1 month' + interval '5 days') 
      , (3, 3.1, now()-interval '1 month' + interval '7 days') ;
select * from django_count order by version desc;      

-- count query. This is what you need in raw sql.
select version, count(*)
  from (
        select userid, max(version) as Version, date_trunc('month',dttz) as "For Month"
          from django_count
         group by userid, date_trunc('month',dttz) 
       ) m
 group by version
 order by version;
如果你能把这个改编成Django,我很乐意帮助你,如果不能,我很抱歉,我无法进一步帮助你。祝你好运