ho scritto su questo su my blog.
La DAU è facile, come hai notato. È possibile risolvere il MAU creando prima una vista con valori booleani per quando un utente attiva e disattiva, in questo modo:
CREATE OR REPLACE VIEW "vw_login" AS
SELECT *
, LEAST (LEAD("date") OVER w, "date" + 30) AS "activeExpiry"
, CASE WHEN LAG("date") OVER w IS NULL THEN true ELSE false AS "activated"
, CASE
WHEN LEAD("date") OVER w IS NULL THEN true
WHEN LEAD("date") OVER w - "date" > 30 THEN true
ELSE false
END AS "churned"
, CASE
WHEN LAG("date") OVER w IS NULL THEN false
WHEN "date" - LAG("date") OVER w <= 30 THEN false
WHEN row_number() OVER w > 1 THEN true
ELSE false
END AS "resurrected"
FROM "login"
WINDOW w AS (PARTITION BY "user_id" ORDER BY "date")
Questo crea valori booleani per utente al giorno quando queste diventano attive, quando si agitano e quando si riattivano.
poi fare un aggregato quotidiana dello stesso:
CREATE OR REPLACE VIEW "vw_activity" AS
SELECT
SUM("activated"::int) "activated"
, SUM("churned"::int) "churned"
, SUM("resurrected"::int) "resurrected"
, "date"
FROM "vw_login"
GROUP BY "date"
;
E infine calcolare i totali in esecuzione di MAUs attiva calcolando le somme cumulative sopra le colonne. È necessario unirsi a vw_activity due volte, poiché il secondo viene aggiunto al giorno in cui l'utente diventa inattivo (vale a dire 30 giorni dall'ultimo accesso).
Ho incluso una serie di date per garantire che tutti i giorni siano presenti nel set di dati.Ne puoi fare anche a meno, ma potresti saltare alcuni giorni nel tuo set di dati.
SELECT
d."date"
, SUM(COALESCE(a.activated::int,0)
- COALESCE(a2.churned::int,0)
+ COALESCE(a.resurrected::int,0)) OVER w
, d."date", a."activated", a2."churned", a."resurrected" FROM
generate_series('2010-01-01'::date, CURRENT_DATE, '1 day'::interval) d
LEFT OUTER JOIN vw_activity a ON d."date" = a."date"
LEFT OUTER JOIN vw_activity a2 ON d."date" = (a2."date" + INTERVAL '30 days')::date
WINDOW w AS (ORDER BY d."date") ORDER BY d."date";
Ovviamente si può fare questo in una singola query, ma questo aiuta a capire meglio la struttura.
Che database stai usando, MySQL o Postgres? –
È in Postgres. –