Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL统计每日新用户数与返回用户数(队列分析)_Mysql_Sql_Statistics - Fatal编程技术网

MySQL统计每日新用户数与返回用户数(队列分析)

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(我习惯于使用时间戳)

比如说

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
关键字<代码>按演员分组(日期为日期)