mysql:每天获取新用户,并按天累计用户总数

时间:2013-02-04 19:22:04

标签: mysql

假设我有一个mysql表t:

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,但它似乎没有做我想要的。

2 个答案:

答案 0 :(得分: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

祝你好运。

答案 1 :(得分: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。