我们有一个巨大的事件表,用户注册和玩我们的游戏.
现在我想确定每一天的第二天保留率,即前一天注册的玩家所占的百分比.
所以假设我们有三个字段
timestamp ts
int userId
int eventId (I.e. 1 = Register, 2 = Login)
Run Code Online (Sandbox Code Playgroud)
这是如何在BigQuery语法中完成的?即我想要以下输出:
Date Register Logins day after % Second day retention
2013-08-23 25 563 4 567 17.8
Run Code Online (Sandbox Code Playgroud)
我没有使用子选择和连接,但它必须是可行的!
Fel*_*ffa 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
Run Code Online (Sandbox Code Playgroud)
这给了我想要的结果:

请注意,查询使用STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day多次,将源字符串数据转换为日期.如果我拥有数据,我会预先在表格上运行ETL,以跳过这个重复步骤.
该查询连接2个表:
第一个表计算特定日期中存在多少个不同的"演员".注意COUNT DISTINCT上的第二个参数,以使计数精确.
第二个表在第二天加入给定日期,假设两天都有同一个演员.然后,您可以计算在给定日期和第二天中有多少演员.
加入这两个表可以得到两个计数,你可以继续划分.
还有其他方法,这只是众多方法中的一种.也可以进一步优化此查询.
| 归档时间: |
|
| 查看次数: |
5506 次 |
| 最近记录: |