如何在BigQuery中进行子选择

Gun*_*app 4 google-bigquery

我们有一个巨大的事件表,用户注册和玩我们的游戏.

现在我想确定每一天的第二天保留率,即前一天注册的玩家所占的百分比.

所以假设我们有三个字段

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上的第二个参数,以使计数精确.

  • 第二个表在第二天加入给定日期,假设两天都有同一个演员.然后,您可以计算在给定日期和第二天中有多少演员.

  • 加入这两个表可以得到两个计数,你可以继续划分.

还有其他方法,这只是众多方法中的一种.也可以进一步优化此查询.