J'essaie de calculer la rétention quotidienne des sessions de connexion des utilisateurs en utilisant pgadminIII/postgresql.Calculer la rétention pour les utilisateurs quotidiens avec PosgreSQL
table1
a user_id
, first_login_date
, last_login_date
CREATE TABLE table1 (user_id numeric, first_login_date date, last_login_date date);
INSERT INTO table1 (user_id, first_login_date, last_login_date) VALUES (12346, '2010-06-01', '2010-06-02'),
(67890, '2010-03-01', '2010-03-10'),
(67890, '2010-03-01', '2010-03-10'),
(90123, '2010-08-01', '2010-08-15'),
(45678, '2010-08-01', '2010-08-20'),
(76543, '2010-07-01', '2010-07-01');
table2
a user_id
, session_id
, login_date
CREATE TABLE table2 (user_id numeric, session_id numeric, login_date date);
INSERT INTO table2 (user_id, session_id, login_date) VALUES
(12346, '8764', '2010-06-02'),
(67890, '4657', '2010-03-05'),
(90123, '3945', '2010-08-09'),
(45678, '20845', '2010-08-02'),
(67890, '29384', '2010-03-07'),
(90123, '3424', '2010-08-12'),
(45678, '349284', '2010-08-10');
Il y a quelques doublons dans table1
. Pour cette raison, je ne suis pas sûr si ma requête pour calculer les utilisateurs qui ont rétention de 2 jours et 5 jours de rétention est correcte.
La requête que je me sers pour les 2 jours est:
SELECT table1.user_id, first_login_date, table2.login_date,
(table2.login_date - table1.first_login_date) as datediff, FROM table1
JOIN table2 ON table2.user_id = table2.user_id WHERE
(table2.login_date - table1.first_login_date) = 1;
qui donne le résultat de 7 utilisateurs avec rétention de 2 jours
Cependant, si j'ajoute la clause distincte, telle as:
SELECT distinct table1.user_id, first_login_date, table2.login_date,
(table2.login_date - table1.first_login_date) as datediff FROM table1
JOIN table2 ON table2.user_id = table2.user_id WHERE
(table2.login_date - table1.first_login_date) = 1;
Je reçois le résultat de 3 utilisateurs avec une rétention de 2 jours.
J'ai consulté HERE, HERE et HERE concernant le calcul de la rétention quotidienne, et je ne suis pas sûr si ma technique me donne le bon résultat. Par exemple, pour calculer la DAU, un self-join
serait plus approprié.
Étant donné les données dans table1
et table2
sont mes résultats de rétention de 2 jours précis en utilisant ma requête définie? Existe-t-il un moyen optimisé de calculer cette rétention?
Cette requête ne filtre pas les utilisateurs distincts. Avec ce 'join' il produit plus de lignes que mon entrée. – owwoow14
@ owwoow14: Modifié –