SQL中的保留群组查询

时间:2015-08-18 18:32:49

标签: mysql retention

我有一个看起来像这样的表:

+---------+------------+----------+
| 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 |   |   |
| :           |   |   |   |   |
| :           |   |   |   |   |
+-------------+---+---+---+---+

1 个答案:

答案 0 :(得分:0)

这对于您的输出通常不是很好的格式,因为您必须为要跟踪数据的每个新保留长度添加新列。例如如果在4月你想看看你的1月份注册中有多少仍然存在,那么你必须添加一个" 4"列到您的输出。

更好的输出是month_of_signup,months_active,users_retained(count)然后你可以转向你心中的内容。

如果您需要将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

但是,当明年到来时,你的表中会有两个Januaries,这会让人感到非常困惑。我建议将年份添加到您的输出和汇总中。