Расчет текущей доходности пользователей в BigQuery - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь рассчитать CURR (текущая норма возврата пользователей, см. https://lloydmelnick.com/2019/02/05/lifetime-value-part-26-my-most-valuable-retention-kpis/) с данными, импортированными из Firebase в BigQuery.

Я попытался создать три столбца, чтобы определить, был ли пользователь активен 2 недели назад, 1 неделю назад и на этой неделе, но, похоже, он не работает. Я хочу видеть пользователей, которые активны на этой неделе и также были активны 2 недели и три недели назад.

Это запрос, который я пробовал:

SELECT
  COUNT(DISTINCT user_pseudo_id)
FROM(SELECT
  user_pseudo_id,
  IF( days_from_today >13 AND days_from_today <21, 1, 0) AS prev_week,
  IF( days_from_today >6 AND days_from_today <14, 1, 0) AS last_week,
  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
    `dataset.events_2019*`
  WHERE
    event_name = 'user_engagement'
  GROUP BY
    days_from_today,
    user_pseudo_id))
    WHERE prev_week=1
    GROUP BY prev_week, last_week, this_week

1 Ответ

0 голосов
/ 14 марта 2019

Сделав некоторые изменения в вашем запросе, это сработало для меня:

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

Игра с некоторыми фиктивными данными:

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
  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
ORDER BY 2, 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 в качестве результата. Какой должен быть желаемый результат. Вы можете поиграть с этим запросом, чтобы получить разные результаты анализа.

...