2

假设我有一个 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;

这似乎有效;子查询为每个用户 ID 提供最早的时间戳,外部查询按日期组合。但是我怎样才能把它卷起来得到曾经见过的总数呢?

哦,是的,我查看了MySQL 查询 - 每天查找“新”用户,但它似乎没有达到我想要的效果。

4

2 回答 2

2
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 |
+---------------------+--------+

所以在最后的查询中,我们所做的就是在按日期分组时对这个结果进行计数。

于 2013-02-04T19:51:01.217 回答
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

祝你好运。

于 2013-02-04T19:27:24.487 回答