2017-02-09 85 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