Мои данные о событиях в 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 июня был выше.