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.
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