【问题标题】:MySQL count daily new users VS returned users (cohort analysis)MySQL 统计每日新用户 VS 返回用户(队列分析)
【发布时间】:2015-08-09 21:55:34
【问题描述】:

表结构为:user_id、Date(我习惯用timestamp)

例如

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 上进行了长时间搜索后,我在这里找到了 https://meta.stackoverflow.com/users/107744/spencer7593 提供的一些材料:Weekly Active Users for each day from log 但我没有成功更改他的查询以输出我的预期结果。

感谢您的帮助

【问题讨论】:

    标签: mysql sql statistics


    【解决方案1】:

    感谢斯蒂芬,我对他的查询做了一个简短的修复,即使在大型数据库上有点耗时,它也能很好地工作:

    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)
    

    【讨论】:

      【解决方案2】:

      假设您在某处有一个日期表(并且使用 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
      

      【讨论】:

      • 这里有一个sql syntax 错误,在最后一个group 上。它缺少 by 关键字。 GROUP BY CAST(date AS Date)
      猜你喜欢
      • 2010-10-30
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      相关资源
      最近更新 更多