2013-02-04 20 views
1

每天獲得新用戶,累計用戶比方說,我有一個MySQL表t:mysql的:通過

DateTime timestamp; 
int userid; 

,我想知道有多少總用戶有一段時間。我有這個:

2012-12-04 102 
2012-12-05 101 
2012-12-05 102 
2012-12-05 103 
2012-12-07 101 
2012-12-08 104 

因此,第一次看到101是12/5,第一次看到104是12/7,依此類推。所以我想這一點,總用戶有史以來見過的日期:

2012-12-04 1 
2012-12-05 3 
2012-12-07 3 
2012-12-08 4 

(我不如果有在那裏額外日期將沒有新的條目關心。)

最接近我已經能夠得到的是每天的新用戶數量:

select distinct date, count(*) from 
(select MIN(DATE(timestamp)) date from t group by userid order by date) t1 \ 
GROUP BY date; 

這似乎工作;子查詢爲每個用戶標識提供最早的時間戳,外部查詢按日期進行組合。但是,我怎樣才能把它捲起來以獲得有史以來的總數呢?

噢,我看着MySQL query - find "new" users per day但它似乎沒有做我在找什麼。

回答

1
SELECT x.timestamp 
    , COUNT(DISTINCT y.userid) 
    FROM t x 
    JOIN t y 
    ON y.timestamp <= x.timestamp 
GROUP 
    BY timestamp; 

GaryO,明白爲什麼這個工程,只是把它改寫這樣......

SELECT DISTINCT x.timestamp, y.userid 
    FROM t x 
    JOIN t y 
    ON y.timestamp <= x.timestamp 
ORDER 
    BY x.timestamp 
    , y.userid; 

使用sgeddes的sqlfiddle,這給了我們以下的中間結果:

+---------------------+--------+ 
| timestamp   | userid | 
+---------------------+--------+ 
| 2012-12-04 00:00:00 | 102 | 
| 2012-12-05 00:00:00 | 101 | 
| 2012-12-05 00:00:00 | 102 | 
| 2012-12-05 00:00:00 | 103 | 
| 2012-12-07 00:00:00 | 101 | 
| 2012-12-07 00:00:00 | 102 | 
| 2012-12-07 00:00:00 | 103 | 
| 2012-12-08 00:00:00 | 101 | 
| 2012-12-08 00:00:00 | 102 | 
| 2012-12-08 00:00:00 | 103 | 
| 2012-12-08 00:00:00 | 104 | 
+---------------------+--------+ 

所以在最終查詢中,我們所做的所有事情都是按日期分組時的COUNT結果。

+0

只有代碼的答案几乎和只鏈接答案一樣糟糕。他們根本不是真正的答案。一個很好的答案包含解釋和推理,可能還有一些來源或權威。 – markus

+0

看起來你有一天忙碌的一天!這個解決方案比迄今爲止提供的唯一正確的答案有優勢。 – Strawberry

+0

解釋爲什麼你的答案是正確的,downvote另一個答案,並解釋爲什麼它不正確。這就是SO的工作原理......這就是讓SO不是論壇的原因! – markus

1

假設我瞭解您的要求,您希望返回他們第一次出現的用戶的日期和數量?

SELECT TimeStamp, COUNT(*) 
FROM T JOIN (
    SELECT MIN(TimeStamp) minDate, UserId 
    FROM t 
    GROUP BY UserId) T2 ON T.TimeStamp = T2.minDate AnD T.UserId = T2.UserId 
GROUP BY T.TimeStamp 

和提琴:http://sqlfiddle.com/#!2/c1f5a/9

好運。

+0

sqlfiddle很酷!這是值得了解的!但是我希望的是按日期總共有多少用戶在系統中。草莓的答案在下面是我要找的。儘管我使用sqlfiddle測試了這個答案 - 謝謝! – GaryO