【问题标题】:Grouping query by similar items in a row按行中的相似项目对查询进行分组
【发布时间】:2014-07-23 19:20:18
【问题描述】:

如何将查询返回的所有项目彼此相邻分组。

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

我有一个名为 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 查询或原始 SQL 来做到这一点?

谢谢, 标记

【问题讨论】:

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


【解决方案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

希望对你有帮助

【讨论】:

  • 感谢您抽出宝贵时间回复。它的工作原理是计数将等于总计数,而不是最后一个人/欢呼之间的计数。
  • 是的,对不起,我现在意识到了。如果我能得到你期望的结果,我会尝试:)
【解决方案2】:

在 django ORM 中:

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

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

【讨论】:

    【解决方案3】:
    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,但如果不是这种情况,重写它是微不足道的。

    【讨论】:

      猜你喜欢
      • 2020-05-26
      • 2016-10-28
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多