MySQL如果之前没有出现过值,则计数

时间:2014-09-09 20:19:20

标签: mysql sql count distinct-values

这是users, carts,time的表格。 user可以包含多个 carts。所有匿名 user都有userId = 1000;任何标识的用户的ID都不同于1000

所有cartId都是唯一的。

+------------+-------------+----------------------+
| userId     | cartId      | time                 | 
+------------+-------------+----------------------+
| 7650       | 231         | 2014-08-27 13:41:02  |
+------------+-------------+----------------------+
| 7632       | 221         | 2014-08-27 13:42:02  |
+------------+-------------+----------------------+
| 7650       | 289         | 2014-08-27 14:13:02  |
+------------+-------------+----------------------+
| 1000       | 321         | 2014-08-27 14:41:02  |
+------------+-------------+----------------------+
| 7650       | 500         | 2014-08-27 17:41:02  |

我感兴趣按一天中的小时计算不同的已识别用户数

我尝试了以下操作,但是当我按照小时(日期)对它们进行分组时,它无法记录之前输入的所有ID。

COUNT( distinct (case when userId <> 1000 then userId end)) as numSELFIDUsers

对于输出,我想要类似的东西:

+------------+-------------+----------------------+
| Date       | HourOfDay   | numSELFIDUsers       | 
+------------+-------------+----------------------+
| 2014-08-27 | 13          |  2                   |
+------------+-------------+----------------------+
| 2014-08-27 | 14          |  0                   |
+------------+-------------+----------------------+
| 2014-08-27 | 17          |  0                   |
+------------+-------------+----------------------+

如果有任何问题,请告诉我。 在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

select date(time), hour(time),
       COUNT(distinct case when userId <> 1000 then userId end) as numSELFIDUsers
from usercarts
where date(time) = '2014-08-27'
group by date(time), hour(time)
order by 1, 2;

这与查询中的内容类似。我不确定你的版本为什么不起作用。

编辑:

你似乎也想要0次计数。这有点挑战,但你可以这样做:

select d.dt, h.hr, COUNT(distinct case when userId <> 1000 then userId end) 
from (select distinct date(time) dt from usercarts where dt IN YOUR RANGE) d cross join
     (select 0 as hr union all select 1 union all select 2 union all select 3 union all . . .
      select 23
     ) h left join
     usercart uc
     on date(uc.time) = d.dt and hour(uc.time) = h.hr;

. . .是您将其余数字放在3到23之间的位置。

编辑II:

我怀疑您实际上是在第一次看到用户。如果是这样,试试这个:

select date(firsttime), hour(firsttime), count(*) as NumFirstUsers
from (select userId, min(time) as firsttime
      from usercarts
      where userid <> 1000
      group by userId
     ) u
group by date(firsttime), hour(firsttime)
order by 1, 2;