MySQL统计每日新用户数与返回用户数(队列分析)
表结构是:user_id,Date(我习惯于使用时间戳) 比如说MySQL统计每日新用户数与返回用户数(队列分析),mysql,sql,statistics,Mysql,Sql,Statistics,表结构是:user_id,Date(我习惯于使用时间戳) 比如说 user id | Date (TS) A | '2014-08-10 14:02:53' A | '2014-08-12 14:03:25' A | '2014-08-13 14:04:47' B | '2014-08-13 04:04:47' ... 接下来的一周我有 user id | Date (TS) A | '2014-08-17 09:02:53'
user id | Date (TS)
A | '2014-08-10 14:02:53'
A | '2014-08-12 14:03:25'
A | '2014-08-13 14:04:47'
B | '2014-08-13 04:04:47'
...
接下来的一周我有
user id | Date (TS)
A | '2014-08-17 09:02:53'
B | '2014-08-17 10:04:47'
B | '2014-08-18 10:04:47'
A | '2014-08-19 10:04:22'
C | '2014-08-19 11:04:47'
...
今天我有
user id | Date (TS)
A | '2015-05-27 09:02:53'
B | '2015-05-27 10:04:47'
C | '2015-05-27 10:04:22'
D | '2015-05-27 17:04:47'
我需要知道如何执行单个查询,以查找从活动一开始就属于“返回”用户的用户数
预期结果:
date | New user | returned User
2014-08-10 | 1 | 0
2014-08-11 | 0 | 0
2014-08-12 | 0 | 1 (A was active on 08/11)
2014-08-13 | 1 | 1 (A was active on 08/12 & 08/11)
...
2014-08-17 | 0 | 2 (A & B were already active )
2014-08-18 | 0 | 1
2014-08-19 | 1 | 1
...
2015-05-27 | 1 | 3 (D is a new user)
在对Stackoverflow进行了长时间的搜索之后,我找到了此处提供的一些资料:但我没有成功地更改他的查询以输出我预期的结果
感谢您的帮助假设您在某处有一个日期表(并且使用t-sql语法,因为我更了解它…),关键是分别计算每个用户的mindate,计算当天的用户总数,然后将返回的用户声明为非新用户:
SELECT DateTable.Date, NewUsers, NumUsers - NewUsers AS ReturningUsers
FROM
DateTable
LEFT JOIN
(
SELECT MinDate, COUNT(user_id) AS NewUsers
FROM (
SELECT user_id, min(CAST(date AS Date)) as MinDate
FROM Table
GROUP BY user_id
) A
GROUP BY MinDate
) B ON DateTable.Date = B.MinDate
LEFT JOIN
(
SELECT CAST(date AS Date) AS Date, COUNT(DISTINCT user_id) AS NumUsers
FROM Table
GROUP CAST(date AS Date)
) C ON DateTable.Date = C.Date
多亏了Stephen,我对他的查询做了一个简短的修复,即使在大型数据库上有点费时,也能很好地工作:
SELECT
DATE(Stats.Created),
NewUsers,
NumUsers - NewUsers AS ReturningUsers
FROM
Stats
LEFT JOIN
(
SELECT
MinDate,
COUNT(user_id) AS NewUsers
FROM (
SELECT
user_id,
MIN(DATE(Created)) as MinDate
FROM Stats
GROUP BY user_id
) A
GROUP BY MinDate
) B
ON DATE(Stats.Created) = B.MinDate
LEFT JOIN
(
SELECT
DATE(Created) AS Date,
COUNT(DISTINCT user_id) AS NumUsers
FROM Stats
GROUP BY DATE(Created)
) C
ON DATE(Stats.Created) = C.Date
GROUP BY DATE(Stats.Created)
在最后一个
组
上,这里有一个sql语法
错误。它缺少一个by
关键字<代码>按演员分组(日期为日期)