Я создаю приложение на основе 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.1
и 3.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}]