【问题标题】:MySQL - Group by two ColumnsMySQL - 按两列分组
【发布时间】:2015-11-25 07:46:42
【问题描述】:

我有一张像这样的表

id, user_id   , type, date
3,  ivnWvOQqoN, iOS , 2015-11-24 15:46:09
4,  dskIbJhuSd, iOS , 2015-11-23 19:39:31
5,  dskIbJhuSd, iOS , 2015-11-24 23:37:45
6,  ----------, iOS , 2015-11-22 23:38:05
7,  ----------, iOS , 2015-11-23 23:38:10

现在我正在做这样的查询

SELECT COUNT(*) AS entries, user_id, DATE(created_at) as date, device_type
FROM App_Usage
WHERE device_type = 'iOS'
  AND created_at between 2015-11-22 AND 2015-11-25
GROUP BY DATE(created_at), user_id

这个返回结果我期望它看起来像这样

((1L, '----------', datetime.date(2015, 11, 22), 'ios'),
(1L, 'dskIbJhuSd', datetime.date(2015, 11, 23), 'ios'),
(1L, '----------', datetime.date(2015, 11, 23), 'ios'),
(1L, 'dskIbJhuSd', datetime.date(2015, 11, 24), 'ios'),
(1L, 'ivnWvOQqoN', datetime.date(2015, 11, 24), 'ios')

上面代码的最后两行,成为下一个代码的最后一行。上面代码的第二行变成了下面代码的第二行。

我的问题是我可以按日期分组,如果用户不是'----------',那么它会返回这样的结果

((1L, '----------', datetime.date(2015, 11, 22), 'ios'),
(1L, 'combo of users' datetime.date(2015, 11, 23), 'ios'),
(1L, '----------', datetime.date(2015, 11, 23), 'ios'),
(2L, 'combo of users', datetime.date(2015, 11, 24), 'ios'),

我在第一个结果中留下了 user_id,以表明只要用户是 '---------',我希望将它们分组,将其他分组。

所以我想按日期分组,然后按用户不是'----------' 的位置分组,我怎么能这样做,甚至可能吗?

期望的输出

输出:

number of uses, user_id**, type, date;
(1, '----------', 'ios', '2015-11-22 23:38:05'),
(1, 'some users or combo', 'ios', '2015-11-22 13:33:33'),
(2, 'some users or combo', 'ios', '2015-11-23 13:35:37'),
(1, '----------', 'ios', '2015-11-24 00:09:44'),
(2, 'some users or combo', 'ios', '2015-11-24 00:09:44'),

**所以我希望任何“----------”的用户都是 与 '--------' 分组,但任何不是 '--------' 的用户都是 goruped 与所有其他用户。正如你在 24 日看到的, 两种不同的用途合二为一,用途是'--------' 是serperate(这是上面的最后两行)

【问题讨论】:

  • 你能提供一个sqlfiddle和正确的结果
  • @Strawberry 一定给我一分钟
  • 一般 GROUP BY 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须标识一个分组列或者是一个集合函数的参数。
  • @Strawberry 在小提琴上工作,我对结果进行了编辑以使其更清晰,我希望将“---------”用户分组,然后将所有其他用户分组用户分组,如果你明白我的意思
  • @jarlh 在这种情况下没关系

标签: python mysql sql


【解决方案1】:
select count(*) as entries, dateCreate, device_type, user_id
from 
    (SELECT DATE(created_at) as dateCreate, device_type, case when user_id = '----------' then '-----------' else 'combo of users' as user_id  
    FROM App_Usage 
    WHERE device_type = 'iOS' 
    AND created_at between 2015-11-22 
    AND 2015-11-25) as temp_table 
GROUP BY dateCreate, user_id, device_type

注意:使用 dateCreate 而不是 date,因为它是关键字

【讨论】:

  • 这给出错误#1248 - Every derived table must have its own alias
  • 更改什么添加别名?
  • 此查询从结果中删除 user_id = '----------' 的所有值是否正确?
  • 太棒了。我在问题的最终代码部分中添加了对我想要的结果的编辑以使其更清楚,我希望将“----------”用户分组,然后将所有其他用户分组,如果您明白我的意思
  • 请在编辑中查看所需的输出,sqlfiddle.com/#!9/418d6c 这个小提琴显示了表格中的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2022-11-21
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多