如何根据行的接近程度进行分组

时间:2011-04-07 20:13:10

标签: sql django orm

说我的模型看起来像:

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

我想让按用户分组的用户的所有操作都在15分钟之内。如果可能的话,最好是在django的ORM中,但如果没有别的办法,那么PostgreSQL的答案也不会错。

更多澄清:

我正在寻找的是如果ab相隔13分钟,bc相隔10分钟,{{1}即使ab相隔23分钟,{}} ca也会组合在一起。

2 个答案:

答案 0 :(得分:1)

从您的示例中,我假设每个后续操作都将在排序的操作列表中的最后一个操作的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

答案 1 :(得分:0)

您可以在操作上添加time_length字段,该字段将设置为自创建时的上一个操作以来的时间(如果它在您的窗口内),如果不是,则设置为NULL。然后在动作action_group上添加第二个字段,该组具有唯一的ID。然后在您的报告中,您可以只使用GROUP BY action_group。