2015-08-18 1 views
0

J'ai une table qui ressemble à ceci:rétention Cohorte requête dans SQL

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

sortie doit être:

Months_since_live

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

Répondre

0

Ceci est généralement pas un grand format votre sortie car vous devrez ajouter une nouvelle colonne pour chaque nouvelle durée de rétention que vous souhaitez suivre les données. par exemple. Si en avril vous voulez voir combien de vos inscriptions de janvier sont toujours là, vous devrez ajouter une colonne "4" à votre sortie.

Une meilleure sortie serait month_of_signup, months_active, users_retained (count) alors vous pouvez pivoter au contenu de votre coeur.

Si vous devez agréger start_date en mois ou le transformer en chaîne, vous pouvez l'ajouter à la fois au groupe select et au groupe.

Si vous voulez vraiment que votre sortie d'origine:

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 

Cependant, cela va être vraiment déroutant lorsque les rouleaux de la prochaine année et que vous avez deux dans votre table les mois de janvier. Je suggère d'ajouter l'année à votre sortie et à votre agrégation.