繁体   English   中英

如何根据已经活跃的用户(而不是基于用户注册日期)计算每月用户保留数?

[英]How to Calculate Month over Month User Retention based on already active users (not based on user signup date)?

我有一个跟踪用户活动的表(即用户在什么时候开始会话?)。 该表包含截至2018年12月的数据。 我需要根据用户活动(例如, 在2018年12月,有500位用户处于活动状态 )来计算每月保留时间(不是基于注册日期) 。那么,在1月,2月,3月...中有多少用户处于活动状态。活动应在2019年1月进行,2019年2月进行...到目前为止,用户 )。

我尝试了硬编码的方式,即让Table中的2018年12月的用户进入表 ,然后让另一个Table中的2019年1月的用户进入并基于user_ids联接两个表,但是为此我必须编写很多联接。 需要一种动态的方式来检查用户保留率以及2018年12月之后所有月份的月度保留额(因为该数据自本月起可用)。

select A.year_month_id,count(distinct A.user_id) as November_Users,count(distinct B.user_id) as December_Retained_Users 
FROM (
        select date_trunc('month', ua.created_at) as monthly,
        ua.user AS user_id
        FROM     user_activity ua
        WHERE    ua.event_type='StartSession'
        and     cast(ua.created_at as date) between cast('20181201' as date) and cast('20181231' as date)
        GROUP BY 1,2
    ) AS A
left Join 
    (
        select date_trunc('month', ua.created_at) as monthly,
        ua.user AS user_id
        FROM     user_activity ua
        WHERE    ua.event_type='StartSession'
        and     cast(ua.created_at as date) between cast('20190101' as date) and cast('20190131' as date)
        GROUP BY 1,2
    ) AS B 
on A.user_id=B.user_id
group by 1

user_activity表号

id | user | event_type   | created_at
1  | A1   | StartSession | April 29, 2019, 3:59 AM
2  | A2   | StartSession | December 29, 2018, 1:07 AM
3  | A3   | StartSession | December 9, 2018, 4:59 PM
49 | A31  | StartSession | May 25, 2019, 11:59 AM
100| A46  | StartSession | April 29, 2019, 3:56 AM

预期产量

Month |Monthly_Active_Users| Jan_Retained|Feb_Retained|Mar_Retained|.......
Dec   | 500                |  300        |  200       | 330
Jan   | 700                |  N/A        |  450       | 410
Feb   | 1000               |  N/A        |  N/A       | 820
Mar   | 920                |  N/A        |  N/A       | N/A
.
.
.
.
Aug   | 100                | N/A         |    N/A     | N/A

我认为这可以完成工作:

with t as (
    select distinct user_, to_char(created_at, 'yymm') dt
      from user_activity where event_type = 'StartSession'),
  u as (
    select a.user_, a.dt mth, b.dt dt, count(distinct a.user_) over (partition by a.dt) cnt
      from t a join t b on (a.user_ = b.user_ and b.dt >= a.dt))
select * from u pivot (count(user_) for dt in (1901, 1902, 1903, 1904)) order by mth

dbfiddle演示

我假设一列created_atdate数据类型。 如果不是,请使用cast,无论哪种方法都适合您。 我们需要将此值在查询中转换为yymm user也是保留字,我在查询中使用了user_

用所有月份(1901 ... 1908)填充ivot的in子句中的列表,以后再添加下个月。 Pivot在此处不允许使用动态语法,您必须指定它们。

这个怎么运作:

第一-表中的不同值(用户,月份)。 然后是最重要的部分-自我联接,它为每个用户创建开始月份和将来月份的元组。 同样在这里,我添加了分析计数,这是您报告中的第二列。 最后的枢轴只是聚合这些准备好的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM