如何在BigQuery中进行子选择

时间:2013-08-27 15:43:29

标签: google-bigquery

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

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

假设我们有三个字段

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

我的子选择和连接失败了,但它必须是可行的!

1 个答案:

答案 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

这给了我想要的结果:

Results for the query

请注意,查询多次使用STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day,将源字符串数据转换为日期。如果我拥有这些数据,我会预先在表格上运行一个ETL,以跳过这个重复步骤。

查询加入2个表:

  • 第一个表格计算特定日期中有多少个不同的“演员”。请注意COUNT DISTINCT上的第二个参数,以使计数精确。

  • 第二个表在第二天加入指定的一天,因为两天都有同一个演员。然后你可以计算在给定的一天和第二天有多少演员出现。

  • 加入这两个表可以获得两个数据,然后你可以进行分割。

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