我们有一个巨大的事件表,用户注册和玩我们的游戏。
现在我想确定每一天的第二天保留率,即前一天注册的玩家所占比例。
假设我们有三个字段
timestamp ts
int userId
int eventId (I.e. 1 = Register, 2 = Login)
这是如何在BigQuery语法中完成的?即我想要以下输出:
Date Register Logins day after % Second day retention
2013-08-23 25 563 4 567 17.8
我的子选择和连接失败了,但它必须是可行的!
答案 0 :(得分:10)
这个查询与公共数据如何:
SELECT
a.day, first_day, return_next_day,
integer((return_next_day / first_day) * 100) percent
FROM (
SELECT COUNT(DISTINCT actor, 50000) first_day,
STRFTIME_UTC_USEC(
UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day,
FROM
[publicdata:samples.github_timeline]
GROUP BY day) a
JOIN (
SELECT
COUNT(*) return_next_day, day
FROM (
SELECT
a.day day, a.actor, b.day, b.actor
FROM (
SELECT
STRFTIME_UTC_USEC(
UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day,
MAX(STRFTIME_UTC_USEC(86400000000 + UTC_USEC_TO_DAY(
PARSE_UTC_USEC(created_at)), "%Y-%m-%d")) dayplus,
actor
FROM
[publicdata:samples.github_timeline]
GROUP EACH BY actor, day) a
JOIN EACH (
SELECT
STRFTIME_UTC_USEC(
UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day,
actor
FROM
[publicdata:samples.github_timeline]
GROUP EACH BY actor, day) b
ON a.actor = b.actor
AND a.dayplus = b.day
)
GROUP BY day) b
ON a.day = b.day
这给了我想要的结果:
请注意,查询多次使用STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day
,将源字符串数据转换为日期。如果我拥有这些数据,我会预先在表格上运行一个ETL,以跳过这个重复步骤。
查询加入2个表:
第一个表格计算特定日期中有多少个不同的“演员”。请注意COUNT DISTINCT上的第二个参数,以使计数精确。
第二个表在第二天加入指定的一天,因为两天都有同一个演员。然后你可以计算在给定的一天和第二天有多少演员出现。
加入这两个表可以获得两个数据,然后你可以进行分割。
还有其他方法,这只是众多方法中的一种。也可以进一步优化此查询。