使用 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 进行队列分析的主要内容,如果未能解决你的问题,请参考以下文章
不使用 jdbc 驱动程序查询 Amazon Redshift
使用 Amazon Redshift / PostgreSQL 进行队列分析