这是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 |
+------------+-------------+----------------------+
如果有任何问题,请告诉我。 在此先感谢您的帮助。
答案 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;