【问题标题】:Calculate retention for daily users with PostgreSQL使用 PostgreSQL 计算每日用户的留存率
【发布时间】:2016-05-30 08:30:35
【问题描述】:

我正在尝试使用 pgadminIII / postgresql 计算用户登录会话的每日保留率。

table1user_idfirst_login_datelast_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');

table2user_idsession_idlogin_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');

table1 中有一些重复项。 因此,我不确定我计算保留 2 天和 5 天的用户的查询是否正确。

我用于 2 天的查询是:

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;

给出 7 个用户留存 2 天的结果

但是,如果我添加 distinct 子句,例如:

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;

我得到了 3 个用户保留 2 天的结果。

我已经咨询了HEREHEREHERE 关于每日留存率的计算,但我不确定我的技术是否给出了正确的结果。例如,要计算 DAU,self-join 是否更合适。

鉴于table1table2 中的数据,使用我定义的查询,我的2 天保留结果是否准确? 有没有一种优化的方法来计算这种留存率?

【问题讨论】:

    标签: sql postgresql metrics pgadmin retention


    【解决方案1】:

    你正在加入 table2 到它自己:

    ON table2.user_id = table2.user_id
    

    在子查询中执行distinct

    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
    

    【讨论】:

    • 此查询不过滤不同的用户。有了这个join,它产生的行数比我输入的要多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多