2017-02-09 82 views
1

我有一个用户活动表。MySql组和按年份计数

created_at account_id 
2017-01-01 1221  
2017-01-01 21458 
2017-01-03 1221  
2017-01-04 1221 
2017-01-04 4555 
.... 

现在我可以得到使用此查询在某个星期内处于活动状态的唯一用户数(account_id)。

SELECT YEARWEEK(created_at) as yearweek, COUNT(DISTINCT account_id) as count 
FROM activities 
GROUP BY YEARWEEK(created_at) 

这将返回

|yearweek|count| 
================ 
| 201701 | 221 | 
| 201702 | 253 | 
| 201703 | 282 | 
| 201704 | 252 | 
| 201705 | 247 | 
| 201706 | 135 | 

什么其实我是想明白的是,某一周或前3周内均活跃用户数。

换句话说,如果用户上周,或2周前或3周前活跃,他也应该计算在本周。 (共4周)显然,用户也应该计入他以前活跃在其中的每个星期。

是否有可能通过MySql实现此目的?如果是这样,怎么样?

回答

1

你想在一个星期来算,用户是其中活跃在一周之前三个星期之一。

一个简单的方法是生成相应的用户/周记录(例如,当用户在第3周活动时,生成假记录以假装用户在第4周,第5周,和#6)。

select wk, count(*) 
from 
(
    select account_id, yearweek(created_at) as wk from activities 
    union 
    select account_id, yearweek(created_at + interval 7 day) as wk from activities 
    union 
    select account_id, yearweek(created_at + interval 14 day) as wk from activities 
    union 
    select account_id, yearweek(created_at + interval 21 day) as wk from activities 
) x 
GROUP BY wk 
ORDER BY wk; 

(您也可以使用UNION ALLCOUNT(DISTINCT account_id)代替UNIONCOUNT(*)。)

+0

我能够使用这种即使在我的2万行数据集中蔓延超过2个表,它有点慢。 (约7秒)幸运的是,这是为了报告的目的,所以没关系。谢谢。 –

1

可能是你可以使用一段如4周:

select count(distinct acccount_id) 
from activities 
where created_at BETWEEN curdate() AND DATE_SUB(curdate(), INTERVAL 4 WEEK) 
+1

@denny非常感谢你.. – scaisEdge