按行中的类似项目对查询进行分组

时间:2014-06-03 12:41:07

标签: mysql sql django django-models django-queryset

如何对查询返回的所有项目进行分组。

如果我只提供一个例子,很难解释得很好。

我有一个名为UserActions的数据库,其中包含两列和以下数据:

ID | User | Action
1  | Mark | Jump
2  | Mark | Jump
3  | Mark | Jump
4  | Mark | Run
5  | Mark | Run
6  | John | Run
7  | John | Run
8  | Mark | Run
9  | Mark | Run
10 | Mark | Jump
11 | Mark | Jump
12 | John | Jump
13 | John | Jump

我想要的输出是:

Last ID | User | Action   | Count
12      | John | Jump     | 2
10      | Mark | Jump     | 2
8       | Mark | Run      | 2
6       | John | Run      | 2
4       | Mark | Run      | 2
1       | Mark | Jump     | 3

基本上,它按用户和操作对所有项目进行分组,并在下一行是不同的操作或用户之前输出总计数。如果我使用“注释”进行常规分组,它将只对所有项目进行分组。

有没有办法使用Django Query或原始SQL?

谢谢, 标记

3 个答案:

答案 0 :(得分:1)

SELECT Max(ID),Count([Action]) AS [Count], [User], [Action]
FROM @Table1
GROUP BY [User],[Action]

上述查询将产生所需的输出。

生成的输出是:

LastID  User    Action  Count
13  John    Jump    2
11  Mark    Jump    5
7   John    Run 2
9   Mark    Run 4

希望有所帮助

答案 1 :(得分:0)

在django ORM中:

(Model.objects.values('user', 'action')
              .order_by()
              .annotate(max_id=models.Max('id'),
                        count=models.Count('action')))

请注意空.order_by()。为了覆盖Meta中声明的一个,需要它。 Django在ordering字段中包含默认的GROUP BY字段。

答案 2 :(得分:0)

SELECT x.* 
  FROM my_table x 
  LEFT 
  JOIN my_table y 
    ON y.user = x.user 
   AND y.action = x.action 
   AND y.id = x.id - 1 
 WHERE y.id IS NULL;

根据示例,这假设连续的增量ID,但如果情况并非如此,那么重写它是微不足道的。