2016-05-30 3 views
0

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?

Répondre

1

Vous joindrez table2 à lui-même:

ON table2.user_id = table2.user_id 

Est-ce que le distinct dans une sous-requête:

select distinct on (t2.login_date) 
    user_id, 
    first_login_date, 
    t2.login_date, 
    t2.login_date - t1.first_login_date as datediff 
from 
    (
     select distinct * 
     from t1 
    ) t1 
    inner join 
    t2 using (user_id) 
where t2.login_date - t1.first_login_date = 1 
user_id | first_login_date | login_date | datediff 
---------+------------------+------------+---------- 
    12346 | 2010-06-01  | 2010-06-02 |  1 
    45678 | 2010-08-01  | 2010-08-02 |  1 
+0

Cette requête ne filtre pas les utilisateurs distincts. Avec ce 'join' il produit plus de lignes que mon entrée. – owwoow14

+0

@ owwoow14: Modifié –