我们有一个用户注册和玩游戏的事件表。
假设我们有三个字段
timestamp ts
int userId
int eventId (I.e. 1 = Register, 2 = Login)
我们想要计算的是给定日期和之后的保留率。如果用户在上周(即7天)进行了比赛,则该用户应被视为有效。
E.g。假设我想查看已注册用户的保留曲线2013-08-01
输出表可能类似于
Date Day Reg 2013-08-01, Active, Retention
2013-08-01 1 24 567 24 567 100%
2013-08-02 2 24 567 24 567 100%
2013-08-03 3 24 567 24 567 100%
2013-08-04 4 24 567 24 567 100%
2013-08-05 5 24 567 24 567 100%
2013-08-05 6 24 567 24 567 100%
2013-08-05 7 24 567 24 567 100%
2013-08-05 8 24 567 24 125 98.2%
2013-08-05 9 24 567 24 027 97.8%
2013-08-05 10 24 567 23 997 97.5%
2013-08-05 11 24 567 23 200 96.3%
2013-08-05 12 24 567 22 890 95.3%
....
我的SQL技能简直太差了!对于想出这个SQL的人来说,免费啤酒(或GT在斯德哥尔摩...)
答案 0 :(得分:1)
要获得活跃用户的数量,我可能会尝试在Google BigQuery中执行类似的操作:
SELECT count(distinct U1.userId, 1000000) as activeUser,
left(U1.startTime, 10) AS day
FROM [YourDataSet.YourTable] as U1
JOIN EACH [YourDataSet.YourTable] as U2 on U1.userId = U2.userId
WHERE U2.startTime = U1.startTime -- if the user came today OR
OR (U2.startTime < U1.startTime AND
TIMESTAMP(U2.startTime) >= DATE_ADD(TIMESTAMP(U1.startTime), -7, "DAY")) -- if the user came sometime in the past and not more than 7 days
GROUP BY day
ORDER BY day
*请注意,在我的情况下,日期是一个字符串。对于您的特定问题,您可能需要添加自定义条件来处理您的事件类型。还请验证条件,检查是否早于7天,因为我没有测试过这部分。
此查询仅允许获取活动用户数。对于其余的,您可能需要在另一个查询中执行此操作。也许有一种方法可以同时使用工会或类似的东西,但这将是一个非常长的查询。希望这有帮助!