Ich mache eine Kohortenanalyse und kann die Gruppe der Benutzer untersuchen lassen, dann sehen, ob sie in den folgenden Monaten getätigt haben. Aber ich will es so:Postgres - Kohortenanalyse über Monate sequenziell, nicht wenn in irgendeinem späteren Monat existiert
Von dieser Gruppe im Dezember, die in Jan getätigt; der Jan Gruppe von Dezember, die im Februar getätigten Im Grunde genommen bin Tracking i Verfall der Kundenbasis
Was ich will, nicht mit denen, die in jedem Monat zurückkehren folgenden Dezember, die dies ist:
WITH start_sample AS (
SELECT
user_fk,
created_at AS start_sample_date
FROM transactions
WHERE created_at >= '2016-11-01' AND created_at < '2016-12-01'
GROUP BY user_fk,
start_sample_date),
start_sample_min AS (
SELECT
user_fk,
MIN(start_sample_date) AS first_transaction
FROM start_sample
GROUP BY user_fk
)
SELECT
DATE_TRUNC('month', created_at) AS transacting_month,
COUNT(DISTINCT user_fk)
FROM transactions
WHERE created_at >= '2016-11-01'
AND t.user_fk IN(SELECT user_fk FROM start_sample_min)
GROUP BY transacting_month
ORDER BY transacting_month;
Dann machte ich ein Abwanderungs Modell zu sehen, ob es würde bekommen, was ich brauche, aber es funktioniert nicht:
WITH monthly_users AS (
SELECT
user_fk AS monthly_user_fk,
DATE_TRUNC('month', created_at) AS month
FROM transactions
WHERE created_at >= '2016-11-01' AND created_at < '2017-12-01'
GROUP BY monthly_user_fk, month
ORDER BY monthly_user_fk, month
),
lag_lead AS (
SELECT
monthly_user_fk,
month,
LAG(month,1) OVER (PARTITION BY monthly_user_fk ORDER BY month) AS lag,
LEAD(month,1) OVER (PARTITION BY monthly_user_fk ORDER BY month) AS lead
FROM monthly_users),
lag_lead_with_diffs AS (
SELECT
monthly_user_fk,
month,
lag AS previous_month,
lead AS next_month,
EXTRACT(EPOCH FROM (month - lag)/86400)::INT AS lag_size,
EXTRACT(EPOCH FROM (lead - month)/86400)::INT AS lead_size
FROM lag_lead
),
calculated AS (
SELECT
month,
CASE WHEN previous_month IS NULL THEN 'ACTIVATION'
WHEN lag_size <= 31 THEN 'ACTIVE'
WHEN lag_size > 31 THEN 'RETURN' END AS this_month_values,
CASE WHEN (lead_size > 31 OR lead_size IS NULL) THEN 'CHURN' ELSE NULL END AS next_month_churn,
COUNT(DISTINCT monthly_user_fk) AS c_d_users
FROM lag_lead_with_diffs
GROUP BY month, 2, 3
)
SELECT
month,
this_month_values,
SUM(c_d_users) AS distinct_users
FROM calculated
GROUP BY month, this_month_values
UNION
SELECT month + INTERVAL '1 month',
'CHURN',
SUM(c_d_users)
FROM calculated
WHERE next_month_churn IS NOT NULL
GROUP BY month + INTERVAL '1 month', 2
HAVING (EXTRACT(EPOCH FROM (month + INTERVAL '1 month'))) < 1512086400
ORDER BY month, this_month_values;
dies ist jedoch in der Anfangsgruppe nicht festgelegt. Die aktive Gruppe wird von Monat zu Monat gerollt.
Ich verstehe, dass die oben ist wahrscheinlich komplizierter als was ich frage, aber ich kann meinen Kopf nicht scheinen um ihn herum
Vielen Dank im Voraus zu bekommen
Das ist wirklich großartig, genau das, was ich brauchte. Danke – MassiveOwl
Würde es Ihnen etwas ausmachen, mir mit der Zeile "Monate zwischen" Linie zu helfen? Warum machst du 2017 - 2016 * 12 -11? Ich versuche es zu konvertieren, um auch Wochen zu machen – MassiveOwl
hatte nur eine Gehirnwelle, Sie müssen die Woche Nummer nehmen, die der Datensatz beginnt. Vergiss es, danke nochmal. Wenn jemand interessiert ist, ist es, (DATE_PART ('Jahr', erstellt_at) - 2016) * 52 + DATE_PART ('Woche', erstellt_at) - 45 AS Wochen zwischen – MassiveOwl