SQL来计算保留曲线

时间:2013-09-24 12:46:26

标签: google-bigquery

我们有一个用户注册和玩游戏的事件表。

假设我们有三个字段

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在斯德哥尔摩...)

1 个答案:

答案 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天,因为我没有测试过这部分。

此查询仅允许获取活动用户数。对于其余的,您可能需要在另一个查询中执行此操作。也许有一种方法可以同时使用工会或类似的东西,但这将是一个非常长的查询。希望这有帮助!