gpt4 book ai didi

Django:按月分组后只计算最新的对象

转载 作者:行者123 更新时间:2023-11-29 11:37:16 26 4
gpt4 key购买 nike

我正在构建一个基于 django 的应用程序来收集有关某个软件用户的统计信息。

目标是显示一个图表,其中包含每个月使用某个版本的用户数量。

这是模型:

class Installation(models.Model):
userid = models.IntegerField()
version = models.CharField(max_length=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> |

<sometime>代表来自同一个月的不同时间戳。它表明 userid = 1同月升级到 3.2 版。

这是我的方法:

version_by_month = Installation.objects
.annotate(month=TruncMonth('timestamp'))
.values('month', 'version')
.annotate(Count('userid', distinct=True))

但它有一个问题,它会为两个版本计算一个用户。例如,它计数 userid = 1对于两个版本 3.13.2并返回使用 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}]

最佳答案

好吧,我注意到这是一天多一点的时间,没有任何答案。虽然我不会说 Django,但无法提供直接的解决方案。但也许我可以为您指明正确的方向。
您需要的是通过首先消除用户的多个版本来减少 count universe。在直接 sql 中,这可以通过子选择来实现,子选择仅返回每个用户的最大版本,外部选择计算结果。

-- 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,我很乐意提供帮助,如果不能,我很抱歉无法进一步提供帮助。祝你好运。

关于Django:按月分组后只计算最新的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56887273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com