2013-02-04 27 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