我有一个看起来像这样的表:
+---------+------------+----------+
| 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 | | |
| : | | | | |
| : | | | | |
+-------------+---+---+---+---+
最佳答案
对于您的输出,这通常不是一个很好的格式,因为您必须为要跟踪其数据的每个新的保留时间添加一个新列。例如如果您想在四月份查看仍然有一月份的注册人数,则必须在输出中添加“ 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
但是,当明年到来时,您的桌子上有两个Januaries,这将使您感到非常困惑。我建议也将年份添加到您的输出和汇总中。
关于mysql - SQL中的保留队列查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32080144/