Как сгруппировать по тому, как близко строки во времени - PullRequest
0 голосов
/ 08 апреля 2011

Скажем, у меня есть модель, которая выглядит как:

class Action(models.Model):
    user = models.ForeignKey('auth.User') 
    action = models.IntegerField(choices=ACTION_CHOICES)
    when = models.DateTimeField()

Я хочу, чтобы все действия для пользователя, сгруппированные по ним, были в пределах 15 минут друг от друга. Предпочтительно в ORM django, если это возможно, но если нет другого пути, тогда ответы PostgreSQL не будут плохими.

Больше уточнений:

То, что я ищу, - это то, что если a и b разнесены на 13 минут, b и c разнесены на 10 минут, a b и c будут сгруппированы вместе, хотя a и c разнесены на 23 минуты.

Ответы [ 2 ]

1 голос
/ 08 апреля 2011

Исходя из вашего примера, я предполагаю, что каждое последующее действие будет в течение 15 минут после последнего в отсортированном списке действий:

# sort by when in ascending order
actions = Action.objects.order_by('when')

group_dict = {}
action_list = []

count = 0
for action in actions:
    if action_list:
        diff = action.when - action_list[-1].when
        if diff.seconds <= 900: # 15 minutes in seconds
            action_list.append(action)
        else:
            group_dict[count] = action_list
            action_list = [action]
            count += 1
    else:
        action_list.append(action)

print group_dict
0 голосов
/ 08 апреля 2011

Вы можете добавить поле time_length для действия, которое будет установлено на время с момента предыдущего действия во время создания, если оно находится в вашем окне, или NULL, если это не так. Затем добавьте в действие второе поле action_group с уникальным идентификатором группы. Тогда в своем отчете вы можете просто GROUP BY action_group.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...