假设我有一个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,但它似乎没有做我想要的。
答案 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
祝你好运。
答案 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。