MySQL-按唯一登录天数范围内的用户数和部门分组

MySQL-按唯一登录天数范围内的用户数和部门分组,mysql,sql,Mysql,Sql,我现在正在处理一个查询,它将计算每个用户的唯一登录天数,将它们放在一个bucket中(1-2、3-4个登录天数等),并按部门返回每个bucket中的每个用户数。如果这不太清楚,我很抱歉,希望下面的例子能帮助说明我的问题 我有一张这样的桌子: +-------------+-----------+------------+-----------------+ | time | user_name | dept | event | +----------

我现在正在处理一个查询,它将计算每个用户的唯一登录天数,将它们放在一个bucket中(1-2、3-4个登录天数等),并按部门返回每个bucket中的每个用户数。如果这不太清楚,我很抱歉,希望下面的例子能帮助说明我的问题

我有一张这样的桌子:

+-------------+-----------+------------+-----------------+
|    time     | user_name |    dept    |      event      |
+-------------+-----------+------------+-----------------+
| 2016-01-04  | Joe       | finance    | logged in       |
| 2016-01-04  | Jeff      | marketing  | logged in       |
| 2016-01-04  | Jeff      | marketing  | project created |
| 2016-01-04  | Bob       | finance    | logged in       |
| 2016-01-04  | Mark      | accounting | logged in       |
| 2016-01-05  | Bob       | finance    | logged in       |
| 2016-01-08  | Bob       | finance    | logged in       |
| 2016-01-09  | Jeff      | marketing  | logged in       |
| 2016-01-10  | Jeff      | marketing  | logged in       |
| 2016-01-11  | Nate      | accounting | logged in       |
| 2016-01-11  | Nate      | accounting | project created |
+-------------+-----------+------------+-----------------+
+------------------+-----------------+------------+
| number of logins | number of users |    dept    |
+------------------+-----------------+------------+
| 1-2              |               1 | finance    |
| 3-4              |               1 | finance    |
| 5+               |               0 | finance    |
| 1-2              |               0 | marketing  |
| 3-4              |               1 | marketing  |
| 5+               |               0 | marketing  |
| 1-2              |               2 | accounting |
| 3-4              |               0 | accounting |
| 5+               |               0 | accounting |
+------------------+-----------------+------------+ 
select
  ELT(LEAST(count(*),5), '1-2', '1-2', '3-4', '3-4','5+') as buckets,
  dept,
  count(*) as `number of users`
FROM change_log where event in ('logged in')
WHERE event in ('logged in')  
GROUP BY
  dept,
  ELT(LEAST(count((*),5), '1-2', '1-2', '3-4', '3-4','5+');
我想返回这样的表:

+-------------+-----------+------------+-----------------+
|    time     | user_name |    dept    |      event      |
+-------------+-----------+------------+-----------------+
| 2016-01-04  | Joe       | finance    | logged in       |
| 2016-01-04  | Jeff      | marketing  | logged in       |
| 2016-01-04  | Jeff      | marketing  | project created |
| 2016-01-04  | Bob       | finance    | logged in       |
| 2016-01-04  | Mark      | accounting | logged in       |
| 2016-01-05  | Bob       | finance    | logged in       |
| 2016-01-08  | Bob       | finance    | logged in       |
| 2016-01-09  | Jeff      | marketing  | logged in       |
| 2016-01-10  | Jeff      | marketing  | logged in       |
| 2016-01-11  | Nate      | accounting | logged in       |
| 2016-01-11  | Nate      | accounting | project created |
+-------------+-----------+------------+-----------------+
+------------------+-----------------+------------+
| number of logins | number of users |    dept    |
+------------------+-----------------+------------+
| 1-2              |               1 | finance    |
| 3-4              |               1 | finance    |
| 5+               |               0 | finance    |
| 1-2              |               0 | marketing  |
| 3-4              |               1 | marketing  |
| 5+               |               0 | marketing  |
| 1-2              |               2 | accounting |
| 3-4              |               0 | accounting |
| 5+               |               0 | accounting |
+------------------+-----------------+------------+ 
select
  ELT(LEAST(count(*),5), '1-2', '1-2', '3-4', '3-4','5+') as buckets,
  dept,
  count(*) as `number of users`
FROM change_log where event in ('logged in')
WHERE event in ('logged in')  
GROUP BY
  dept,
  ELT(LEAST(count((*),5), '1-2', '1-2', '3-4', '3-4','5+');
到目前为止,我的查询如下所示:

select 
(case when count(distinct(`time`)) between 1 and 2 then '1-2' 
      when count(distinct(`time`)) between 3 and 4 then '3-4'
      else '5+'
        end) as buckets, dept, user_name
    from change_log where event in ('logged in')  
    group by dept, user_name
然而,这是返回一个如下表,这是我能得到的最接近我想要的,但我不知道如何将它卷到仅仅由桶和部门

+---------+------------+-----------+
| buckets |    dept    | user_name |
+---------+------------+-----------+
| 1-2     | accounting | Mark      |
| 1-2     | accounting | Nate      |
| 3-4     | finance    | Bob       |
| 1-2     | finance    | Joe       |
| 3-4     | marketing  | Jeff      |
+---------+------------+-----------+

为了确保我理解,你基本上是在尝试这样做:

    select 
    (case when count(distinct(`time`)) between 1 and 2 then '1-2' 
          when count(distinct(`time`)) between 3 and 4 then '3-4'
          else '5+'
     end) as buckets, dept, count(*) as `number of users`
from change_log where event in ('logged in')  
group by dept, buckets
现在在MySQL中不能这样做,因为您不能对case语句的输出进行分组,但从功能上来说,这是理想的结果?

类似这样的情况

select buckets, dept, count(user_name) no_of_u from 
(select 
(case when count(distinct(`time`)) between 1 and 2 then '1-2' 
      when count(distinct(`time`)) between 3 and 4 then '3-4'
      else '5+'
        end) as buckets, dept, user_name
    from change_log where event in ('logged in')  
    group by dept, user_name)
group by buckets, dept

但你可以这样做:

+-------------+-----------+------------+-----------------+
|    time     | user_name |    dept    |      event      |
+-------------+-----------+------------+-----------------+
| 2016-01-04  | Joe       | finance    | logged in       |
| 2016-01-04  | Jeff      | marketing  | logged in       |
| 2016-01-04  | Jeff      | marketing  | project created |
| 2016-01-04  | Bob       | finance    | logged in       |
| 2016-01-04  | Mark      | accounting | logged in       |
| 2016-01-05  | Bob       | finance    | logged in       |
| 2016-01-08  | Bob       | finance    | logged in       |
| 2016-01-09  | Jeff      | marketing  | logged in       |
| 2016-01-10  | Jeff      | marketing  | logged in       |
| 2016-01-11  | Nate      | accounting | logged in       |
| 2016-01-11  | Nate      | accounting | project created |
+-------------+-----------+------------+-----------------+
+------------------+-----------------+------------+
| number of logins | number of users |    dept    |
+------------------+-----------------+------------+
| 1-2              |               1 | finance    |
| 3-4              |               1 | finance    |
| 5+               |               0 | finance    |
| 1-2              |               0 | marketing  |
| 3-4              |               1 | marketing  |
| 5+               |               0 | marketing  |
| 1-2              |               2 | accounting |
| 3-4              |               0 | accounting |
| 5+               |               0 | accounting |
+------------------+-----------------+------------+ 
select
  ELT(LEAST(count(*),5), '1-2', '1-2', '3-4', '3-4','5+') as buckets,
  dept,
  count(*) as `number of users`
FROM change_log where event in ('logged in')
WHERE event in ('logged in')  
GROUP BY
  dept,
  ELT(LEAST(count((*),5), '1-2', '1-2', '3-4', '3-4','5+');

这似乎有效!我收到一条“每个派生表都必须有自己的别名”的错误消息,但在从第二条select语句中为派生表提供别名后,它工作了。谢谢!我仍在努力适应嵌套的select语句。如果我真的需要,我会使用它们。在大多数情况下,我有多个嵌套的select语句,会感到困惑。在这些情况下,我尝试创建临时表,并使用它们来获得最终结果。