使用 Amazon Redshift / PostgreSQL 进行队列分析

Posted

技术标签:

【中文标题】使用 Amazon Redshift / PostgreSQL 进行队列分析【英文标题】:Cohort analysis with Amazon Redshift / PostgreSQL 【发布时间】:2015-06-07 20:31:04 【问题描述】:

我正在尝试使用基于 Redshift 中存储的事件数据的同类群组分析来分析用户留存率。

例如,在 Redshift 中我有:

timestamp          action        user id
---------          ------        -------
2015-05-05 12:00   homepage      1
2015-05-05 12:01   product page  1
2015-05-05 12:02   homepage      2
2015-05-05 12:03   checkout      1

我想提取每日留存同类群组。例如:

signup_day  users_count d1  d2  d3  d4  d5  d6  d7 
----------  ----------- --  --  --  --  --  --  --  
2015-05-05  100         80  60  40  20  17  16  12
2015-05-06  150         120 90  60  30  22  18  15

其中signup_day 代表我们记录用户操作的第一个日期,users_count 是注册signup_day 的用户总数,d1 是执行任何操作的用户数量 a在signup_day 等之后的第二天......

有没有更好的方法来表示留存分析数据?

使用 Amazon Redshift 实现这一目标的最佳查询是什么?是否可以使用单个查询?

【问题讨论】:

我会鼓励你对你正在尝试做的事情使用生存分析(基于这个和另一个问题)。但是,该主题对于 Stack Overflow 来说太宽泛了。我想我可以说我写了一本书,其中有两章关于这个主题(在 SQL/Excel 中实现)解释了需要做什么。 【参考方案1】:

最终我发现下面的查询可以满足我的要求。

WITH 

users AS (
  SELECT
    user_id,
    date_trunc('day', min(timestamp)) as activated_at
    from table
    group by 1
  )
,

events AS (
  SELECT user_id,
         action,
         timestamp AS occurred_at
    FROM table
)

SELECT DATE_TRUNC('day',u.activated_at) AS signup_date,


       TRUNC(EXTRACT('EPOCH' FROM e.occurred_at - u.activated_At)/(3600*24)) AS user_period,


       COUNT(DISTINCT e.user_id) AS retained_users
  FROM users u
  JOIN events e
    ON e.user_id = u.user_id
   AND e.occurred_at >= u.activated_at
 WHERE u.activated_at >= getdate() - INTERVAL '11 day'
 GROUP BY 1,2
 ORDER BY 1,2

它生成的表格与我上面描述的略有不同(但更适合我的需要):

signup_date  user_period  retained_users
-----------  -----------  --------------
2015-05-05   0            80
2015-05-05   1            60
2015-05-05   2            40
2015-05-05   3            20
2015-05-06   0            100
2015-05-06   1            80
2015-05-06   2            40
2015-05-06   3            20

【讨论】:

以上是关于使用 Amazon Redshift / PostgreSQL 进行队列分析的主要内容,如果未能解决你的问题,请参考以下文章

Amazon EMR 与 Amazon Redshift

不使用 jdbc 驱动程序查询 Amazon Redshift

amazon-redshift 中的 CONCAT 函数

使用 Amazon Redshift / PostgreSQL 进行队列分析

使用 Amazon Redshift / PostgreSQL 进行漏斗查询

使用自定义 Python 库 ua-parser 的 Amazon Redshift UDF