Google bigquery 在BigQuery中计算当前用户返回率

Google bigquery 在BigQuery中计算当前用户返回率,google-bigquery,firebase-analytics,Google Bigquery,Firebase Analytics,我正在尝试计算当前用户返回率,请参阅从Firebase导入到BigQuery的数据 我试图创建三个列来确定用户在2周前、1周前和本周是否处于活动状态,但它似乎不起作用。我想看看本周活跃的用户,以及2周和3周前活跃的用户 这是我尝试过的查询: 选择 COUNTDISTINCT用户\u伪\u id FROMSELECT 用户\u伪\u id, 如果对您的查询进行一些修改,从今天开始的天数>13天,从今天开始的天数>6天,从今天开始的天数,这对我来说很有效: SELECT user_pseudo

我正在尝试计算当前用户返回率,请参阅从Firebase导入到BigQuery的数据

我试图创建三个列来确定用户在2周前、1周前和本周是否处于活动状态,但它似乎不起作用。我想看看本周活跃的用户,以及2周和3周前活跃的用户

这是我尝试过的查询:

选择 COUNTDISTINCT用户\u伪\u id FROMSELECT 用户\u伪\u id,
如果对您的查询进行一些修改,从今天开始的天数>13天,从今天开始的天数>6天,从今天开始的天数,这对我来说很有效:

SELECT
  user_pseudo_id
FROM (
  SELECT
    user_pseudo_id,
    MAX(IF( days_from_today >13 AND days_from_today < 21, 1, 0)) AS prev_week,
    MAX(IF( days_from_today >6 AND days_from_today <14, 1, 0)) AS last_week,
    MAX(IF( days_from_today <7, 1, 0)) AS this_week
  FROM (
    SELECT
      DATE_DIFF(CURRENT_DATE(), DATE(TIMESTAMP_MICROS(event_timestamp)), day) AS days_from_today,
      user_pseudo_id
    FROM
      test_table
    WHERE
      event_name = 'user_engagement'
    GROUP BY
      days_from_today,
      user_pseudo_id)
  GROUP BY
    user_pseudo_id)
WHERE
  prev_week = 1
这使得该数据集:

  days_from_today   user_pseudo_id   
1        4               1   
2        6               1   
3        12              1   
4        18              1   
5        6               2   
6        18              2   
7        4               3   
这里上周加入的用户是1和2

使用虚拟数据集运行查询:

WITH test_table as (
  select 1 as user_pseudo_id, 'user_engagement' as event_name, 1552208299000000 as event_timestamp union all
  select 2 as user_pseudo_id, 'user_engagement' as event_name, 1552079299000000 as event_timestamp union all
  select 3 as user_pseudo_id, 'user_engagement' as event_name, 1552186299000000 as event_timestamp union all
  select 1 as user_pseudo_id, 'user_engagement' as event_name, 1551024899000000 as event_timestamp union all
  select 2 as user_pseudo_id, 'user_engagement' as event_name, 1551024899000000 as event_timestamp union all
  select 1 as user_pseudo_id, 'user_engagement' as event_name, 1551523899000000 as event_timestamp union all
  select 1 as user_pseudo_id, 'user_engagement' as event_name, 1552024899000000 as event_timestamp
)
SELECT
  user_pseudo_id
FROM (
  SELECT
    user_pseudo_id,
    MAX(IF( days_from_today >13 AND days_from_today < 21, 1, 0)) AS prev_week,
    MAX(IF( days_from_today >6 AND days_from_today <14, 1, 0)) AS last_week,
    MAX(IF( days_from_today <7, 1, 0)) AS this_week
  FROM (
    SELECT
      DATE_DIFF(CURRENT_DATE(), DATE(TIMESTAMP_MICROS(event_timestamp)), day) AS days_from_today,
      user_pseudo_id
    FROM
      test_table
    WHERE
      event_name = 'user_engagement'
    GROUP BY
      days_from_today,
      user_pseudo_id)
  GROUP BY
    user_pseudo_id)
WHERE
  prev_week = 1
给出用户1和2作为结果。这应该是你想要的结果。您可以使用此查询生成所需的不同分析结果

WITH test_table as (
  select 1 as user_pseudo_id, 'user_engagement' as event_name, 1552208299000000 as event_timestamp union all
  select 2 as user_pseudo_id, 'user_engagement' as event_name, 1552079299000000 as event_timestamp union all
  select 3 as user_pseudo_id, 'user_engagement' as event_name, 1552186299000000 as event_timestamp union all
  select 1 as user_pseudo_id, 'user_engagement' as event_name, 1551024899000000 as event_timestamp union all
  select 2 as user_pseudo_id, 'user_engagement' as event_name, 1551024899000000 as event_timestamp union all
  select 1 as user_pseudo_id, 'user_engagement' as event_name, 1551523899000000 as event_timestamp union all
  select 1 as user_pseudo_id, 'user_engagement' as event_name, 1552024899000000 as event_timestamp
)
SELECT
  user_pseudo_id
FROM (
  SELECT
    user_pseudo_id,
    MAX(IF( days_from_today >13 AND days_from_today < 21, 1, 0)) AS prev_week,
    MAX(IF( days_from_today >6 AND days_from_today <14, 1, 0)) AS last_week,
    MAX(IF( days_from_today <7, 1, 0)) AS this_week
  FROM (
    SELECT
      DATE_DIFF(CURRENT_DATE(), DATE(TIMESTAMP_MICROS(event_timestamp)), day) AS days_from_today,
      user_pseudo_id
    FROM
      test_table
    WHERE
      event_name = 'user_engagement'
    GROUP BY
      days_from_today,
      user_pseudo_id)
  GROUP BY
    user_pseudo_id)
WHERE
  prev_week = 1