7-дневное количество пользователей: Big-Query само-присоединиться, чтобы получить диапазон дат и количество? - PullRequest
0 голосов
/ 17 июня 2019

Мои данные о событиях в Google Firebase интегрированы в BigQuery, и я пытаюсь получить отсюда одну из данных, которые Firebase предоставляет мне автоматически: количество пользователей за 1, 7 и 28 дней.

Подсчет за 1 день довольно прост

SELECT
  "1-day" as period,
  events.event_date,
  count(distinct events.user_pseudo_id) as uid
FROM
  `your_path.events_*` as events
WHERE events.event_name = "session_start"
group by events.event_date

с таким аккуратным результатом, как

period   event_date  uid
1-day    20190609    5
1-day    20190610    7
1-day    20190611    5
1-day    20190612    7
1-day    20190613    37
1-day    20190614    73
1-day    20190615    52
1-day    20190616    36

Но для меня это усложняется, когда я пытаюсь считать за каждый день сколькоуникальные пользователи, которые у меня были в предыдущие 7 дней Из приведенного выше запроса я знаю, что мое целевое значение для дня 20190616 будет 142, отфильтровав 7 дней и удалив группу по условию.

Решение, которое я пробовалэто прямое самостоятельное объединение (и варианты, которые не изменили результат)

SELECT
  "7-day" as period,
  events.event_date,
  count(distinct user_events.user_pseudo_id) as uid
FROM
  `your_path.events_*` as events,
  `your_path.events_*` as user_events
WHERE user_events.event_name = "session_start"
  and PARSE_DATE("%Y%m%d", events.event_date) between DATE_SUB(PARSE_DATE("%Y%m%d", user_events.event_date), INTERVAL 7 DAY) and PARSE_DATE("%Y%m%d", user_events.event_date) #one day in the first table should correspond to 7 days worth of events in the second
  and events.event_date = "20190616" #fixed date to check
group by events.event_date

Теперь я знаю, что едва задаю какие-либо условия соединения, но, если таковые имеются, я ожидал перекрестных соединений и огромных результатов.Вместо этого подсчет таким образом равен 70, что намного ниже, чем ожидалось.Кроме того, я могу установить ИНТЕРВАЛ 2 ДНЯ, и результат не изменится.

Я явно делаю что-то здесь очень неправильно, но я также подумал, что то, как я это делаю, очень рудиментарно, и я долженбыть более разумным способом сделать это.

Я проверил Расчет текущего 7-дневного активного пользователя с BigQuery? , но явное перекрестное соединение здесь с event_dim, определение которого я не уверен в


Проверено решение, предоставленное на Скользящие 90 дней активных пользователей в BigQuery, улучшающие преформанс (DAU / MAU / WAU) , как предлагается в комментарии.На первый взгляд решение казалось здравым, но есть некоторые проблемы, которые возникли в последнее время.Вот запрос с использованием COUNT (DISTINCT), который я адаптировал к своему случаю

SELECT DATE_SUB(event_date, INTERVAL i DAY) date_grp
 , COUNT(DISTINCT user_pseudo_id) unique_90_day_users
 , COUNT(DISTINCT IF(i<29,user_pseudo_id,null)) unique_28_day_users
 , COUNT(DISTINCT IF(i<8,user_pseudo_id,null)) unique_7_day_users
 , COUNT(DISTINCT IF(i<2,user_pseudo_id,null)) unique_1_day_users
FROM (
  SELECT PARSE_DATE("%Y%m%d",event_date) as event_date, user_pseudo_id
  FROM `your_path_here.events_*`
  WHERE EXTRACT(YEAR FROM PARSE_DATE("%Y%m%d",event_date))=2019
  GROUP BY 1, 2
), UNNEST(GENERATE_ARRAY(1, 90)) i
GROUP BY 1
ORDER BY date_grp

, и вот результат за последние дни (рассмотрим данные, начинающиеся 23 мая), где вы можете оценить, что результат неправильный

row_num   date_grp     90-day  28-day  7-day   1-day
114       2019-06-16   273     273     273     210
115       2019-06-17   78      78      78      78

, поэтому в последний день этот счет для 90-дневного, 28-дневного, 7-дневного учитывает только один и тот же день вместо всех предыдущих дней.Невозможно, чтобы 90-дневный счет 17 июня составлял 78, если 1-й день 16 июня был выше.

1 Ответ

0 голосов
/ 18 июня 2019

Это AN ответ на мой же вопрос.Мои средства рудиментарны, так как я не очень хорошо знаком с ярлыками BQ и некоторыми продвинутыми функциями, но результат все еще правильный.Я надеюсь, что другие смогут интегрироваться с лучшими запросами.

#standardSQL
WITH dates AS (
  SELECT i as event_date
  FROM UNNEST(GENERATE_DATE_ARRAY('2019-05-24', CURRENT_DATE(), INTERVAL 1 DAY)) i
)
, ptd_dates as (
  SELECT DISTINCT "90-day" as day_category, FORMAT_DATE("%Y%m%d",event_date) AS event_date, FORMAT_DATE("%Y%m%d",DATE_SUB(event_date, INTERVAL i-1 DAY)) as ptd_date
  FROM dates,
    UNNEST(GENERATE_ARRAY(1, 90)) i
  UNION ALL
  SELECT distinct "28-day" as day_category, FORMAT_DATE("%Y%m%d",event_date) AS event_date, FORMAT_DATE("%Y%m%d",DATE_SUB(event_date, INTERVAL i-1 DAY)) as ptd_date
  FROM dates,
    UNNEST(GENERATE_ARRAY(1, 29)) i
  UNION ALL
  SELECT distinct "7-day" as day_category, FORMAT_DATE("%Y%m%d",event_date) AS event_date, FORMAT_DATE("%Y%m%d",DATE_SUB(event_date, INTERVAL i-1 DAY)) as ptd_date
  FROM dates,
    UNNEST(GENERATE_ARRAY(1, 7)) i
  UNION ALL
  SELECT distinct "1-day" as day_category, FORMAT_DATE("%Y%m%d",event_date) AS event_date, FORMAT_DATE("%Y%m%d",event_date) as ptd_date
  FROM dates
)


SELECT event_date,
  sum(IF(day_category="90-day",unique_ptd_users,null)) as count_90_day ,
  sum(IF(day_category="28-day",unique_ptd_users,null)) as count_28_day,
  sum(IF(day_category="7-day",unique_ptd_users,null)) as count_7_day,
  sum(IF(day_category="1-day",unique_ptd_users,null)) as count_1_day
from (
SELECT ptd_dates.day_category
  , ptd_dates.event_date
  , COUNT(DISTINCT user_pseudo_id) unique_ptd_users
FROM ptd_dates,
  `your_path_here.events_*` events,
  unnest(events.event_params) e_params
WHERE ptd_dates.ptd_date = events.event_date
GROUP BY ptd_dates.day_category
  , ptd_dates.event_date)
group by event_date
order by 1,2,3

В соответствии с предложением ECris, я сначала определил таблицу календаря для использования: она содержит 4 категории PTD (период до даты).Каждый из них генерируется из базовых элементов: он должен масштабироваться линейно, так как он не запрашивает набор данных события и поэтому не имеет пробелов.

Затем выполняется соединение с событиями, где условие соединения показывает, как для каждой даты I 'm подсчет отдельных пользователей во всех связанных днях периода.

Результаты верны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...