【问题标题】:Retention Cohort Query in SQLSQL 中的保留队列查询
【发布时间】:2015-08-18 18:32:49
【问题描述】:

我有一张如下所示的表格:

+---------+------------+----------+
| User_id | start_date | end_date |
+---------+------------+----------+
| 123     | 1/1/2015   | 3/1/2015 |
| 234     | 1/1/2015   | 1/1/2015 |
| 345     | 2/1/2015   | 3/1/2015 |
| 456     | 3/1/2015   | 3/1/2015 |
| :       |            |          |
| :       |            |          |
+---------+------------+----------+

输出应该是:

Months_since_live

+-------------+---+---+---+---+
|             | 0 | 1 | 2 | 3 |
+-------------+---+---+---+---+
| Jan_signups | 2 | 1 | 1 | 0 |
| Feb_signups | 1 | 1 | 0 |   |
| Mar_signups | 1 | 0 |   |   |
| :           |   |   |   |   |
| :           |   |   |   |   |
+-------------+---+---+---+---+

【问题讨论】:

    标签: mysql retention


    【解决方案1】:

    这通常不是您输出的好格式,因为您必须为要跟踪数据的每个新保留时间添加一个新列。例如如果您想在 4 月份查看 1 月份的注册人数还有多少,则必须在输出中添加“4”列。

    更好的输出是month_of_signup、months_active、users_retained(计数),然后您可以根据自己的意愿进行调整。

    如果您需要将 start_date 聚合为月份或将其转换为字符串,您可以将其添加到 select 和 group by。

    如果你真的想要你的原始输出:

    select concat(date_format(start_date, '%b'),'_signups') as month,
    sum(if(timestampdiff(month, start_date, end_date) >= 0, 1, 0) as '0',
    sum(if(timestampdiff(month, start_date, end_date) >= 1, 1, 0) as '1',
    sum(if(timestampdiff(month, start_date, end_date) >= 2, 1, 0) as '2',
    sum(if(timestampdiff(month, start_date, end_date) >= 3, 1, 0) as '3'
    from your_table
    group by month
    

    但是,当明年即将到来并且您的桌子上有两个一月时,这会变得非常混乱。我建议也将年份添加到您的输出和聚合中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      相关资源
      最近更新 更多