2016-04-18 12 views
1

Sie möchten eine Kohortenanalyse für eine Benutzerdatenbank durchführen. Wir haben 2 Tabellen "Benutzer" (u.) Und "Sitzungen" (s), wo Benutzer "created_at" -Feld haben und Sitzungen "start_at" -Feld haben.Monatliche Kohortenanalyse SQL

Grundsätzlich, was ich suche ist zu sehen, wie viele Benutzer in einem bestimmten Monat registriert wurden und analysieren, wie viele von ihnen in den folgenden Monaten kommen.

Um zu klären, was ich bekommen möchte, falls ich mit meiner Erklärung nicht klar bin.

Month: January 
Registered users in January: 100 
How many of this 100 registered users, logged in in February?: 97 
How many of this 100 registered users, logged in in Mars?: 56 

Month: February 
Registered users in February: 70 
How many of this 70 registered users, logged in in Mars?: 10 
How many of this 70 registered users, logged in in April?: 32 

Und so weiter ....

Ich verwende den folgenden Abfragecode, bedenken Sie, dass meine Tabellen als UNIX-Zeitstempelformat vorliegen, deshalb verwende ich die Formel von_unitime().

select 
Month(from_unixtime(up.registered_at)) as Month, 
count(distinct up.id) registered, 
count(DISTINCT (CASE WHEN datediff(from_unixtime(u.registered_at),from_unixtime(s.start_at)) <= 60 AND datediff(from_unixtime(u.registered_at),from_unixtime(s.start_at)) > 30 THEN u.id END)) as 30to60, 
count(DISTINCT (CASE WHEN datediff(from_unixtime(u.registered_at),from_unixtime(s.start_at)) <= 90 AND datediff(from_unixtime(u.registered_at),from_unixtime(s.start_at)) > 60 THEN u.id END)) as 60to90 
from users u 
left join sessions s 
on u.id=s.user_id 
group by 1 
limit 100 

Die Abfrage mir falsche Daten zu geben, sagt es genau Zahl der registrierten Menschen, aber nicht, wie viele von ihnen kommen auf den darauffolgenden Monaten zurück.

Können Sie mir bitte eine Hand geben, ich bin sicher, das ist einfacher als ich denke.

Vielen Dank im Voraus.

+0

Die allgemeine GROUP BY-Regel besagt: "Wenn eine GROUP BY-Klausel angegeben ist, muss jede Spaltenreferenz in der SELECT-Liste entweder eine Gruppierungsspalte identifizieren oder das Argument einer set-Funktion sein." (Älteren MySQL-Versionen egal, aber neuere tun.) – jarlh

Antwort

1

Ich würde so etwas wie dies vorstellen:

select date_format(from_unixtime(up.registered_at), '%Y-%m') as reg_yyyymm, 
     date_format(from_unixtime(s.start_at), '%Y-%m') as sess_yyyymm, 
     count(distinct u.id) 
from users u left join 
    sessions s 
    on u.id = s.user_id 
group by reg_yyyymm, sess_yyyymm; 

Diese Ergebnisse zu geben scheint, die Sie beschreiben.

+0

das ist es! es funktioniert ... das war sehr nützlich, es sieht sehr einfach aus, die Abfrage, ich dachte, dass es komplexer werden würde, vielen Dank! – rifoltar