Запрос BigQuery - выполнение события рассчитывает на подвыборы для сгруппированных данных - PullRequest
0 голосов
/ 03 февраля 2020

Коллега попросил получить некоторые данные о статистике пользователей - сколько пользователей смотрят 10 объявлений + и еще несколько параметров, которые я удалил для простоты. Прямо сейчас с очень похожим запросом я получаю единичные счетчики для каждого пользовательского события, которое я добавляю - даже при том, что оно должно подсчитывать, сколько случаев произошло событие для этого конкретного c пользователя.

with data as (
        SELECT user_pseudo_id, event_timestamp, event_name, app_info.id,geo.country as country,platform,app_info.id as bundle_id,app_info.install_source as ins_source,traffic_source.source as traf_source,traffic_source.name as campaign,
                  UNIX_MICROS(TIMESTAMP('2019-11-01 00:00:00')) AS start_day,
                  3600*1000*1000*24 AS one_day_micros
                FROM `api-table.analytics_random.events_*`
                WHERE _table_suffix BETWEEN '20191101' AND '20191215'
              ),
              cohort_info as (
                select user_pseudo_id,bundle_id
                from data
                group by 1,2
              ),
              day_0_users as (
                SELECT DISTINCT user_pseudo_id,
                FROM data
                WHERE event_name = 'first_open'
                  AND event_timestamp BETWEEN start_day AND start_day+(15*one_day_micros)
              ),
              finished_10 as (
                  SELECT DISTINCT user_pseudo_id
                  FROM data
                  WHERE event_name IN( 'ad_finished_10','ads_finished_10')  AND event_timestamp BETWEEN start_day AND start_day+(30*one_day_micros)
              ),
              joined as (
                select
                  cohort_info.user_pseudo_id,
                  cohort_info.bundle_id,
                  count(distinct day_0_users.user_pseudo_id) as day_0_users,
                  count(distinct finished_10.user_pseudo_id) as finished_10_,
                from day_0_users
                left join finished_10 using(user_pseudo_id)
                inner join cohort_info using(user_pseudo_id)
                group by 1,2
              )
              select * from joined

Я думаю, что моя проблема в том, что я выбрал отдельный user_pseudo_id, где мне их посчитать? Проблема в том, что в объединенном подзапросе я попытался выбрать нечетные значения счетчика - результат был таким же.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Я думаю, это то, что вы ищете. Вам нужно извлечь event_time (как уникальное значение для каждого события) и считать его вместо подсчета пользователей.

with data as (
   SELECT user_pseudo_id, event_timestamp, event_name, app_info.id,geo.country as country,platform,app_info.id as bundle_id,app_info.install_source as ins_source,traffic_source.source as traf_source,traffic_source.name as campaign,
      UNIX_MICROS(TIMESTAMP('2019-11-01 00:00:00')) AS start_day,
      3600*1000*1000*24 AS one_day_micros
  FROM `api-table.analytics_random.events_*`
  WHERE _table_suffix BETWEEN '20191101' AND '20191215'
),
finished_10 as (
   SELECT distinct user_pseudo_id
   FROM data
   WHERE event_name IN( 'ad_finished_10','ads_finished_10')  
   AND (event_timestamp BETWEEN start_day AND start_day+(30*one_day_micros))
),
day_0_users as (
   SELECT distinct user_pseudo_id,event_timestamp
   FROM data
   WHERE event_name = 'first_open'
   AND (event_timestamp BETWEEN start_day AND start_day+(15*one_day_micros))
)

select 
   d.user_pseudo_id, 
   d.bundle_id, 
   sum(if(f.user_pseudo_idis null, 0, 1)) as ad_finished_10_count,
   sum(if(dz.event_timestamp is null, 0, 1)) as day_0_count
from data d
left join finished_10 f on f.user_pseudo_id = d.user_pseudo_id
left join day_0_users dz on dz.user_pseudo_id = d.user_pseudo_id
group by 1,2
0 голосов
/ 04 февраля 2020

То, что вы вероятно ищете, - это LEFT OUTER JOIN в обоих подмножествах по отношению к всеобъемлющему data.

Думаю, что-то подобное может дать вам ваш результат:

with data as (
   SELECT user_pseudo_id, event_timestamp, event_name, app_info.id,geo.country as country,platform,app_info.id as bundle_id,app_info.install_source as ins_source,traffic_source.source as traf_source,traffic_source.name as campaign,
      UNIX_MICROS(TIMESTAMP('2019-11-01 00:00:00')) AS start_day,
      3600*1000*1000*24 AS one_day_micros
  FROM `api-table.analytics_random.events_*`
  WHERE _table_suffix BETWEEN '20191101' AND '20191215'
),
finished_10 as (
   SELECT distinct user_pseudo_id
   FROM data
   WHERE event_name IN( 'ad_finished_10','ads_finished_10')  
   AND (event_timestamp BETWEEN start_day AND start_day+(30*one_day_micros))
),
day_0_users as (
   SELECT distinct user_pseudo_id,
   FROM data
   WHERE event_name = 'first_open'
   AND (event_timestamp BETWEEN start_day AND start_day+(15*one_day_micros))
)

select 
   d.user_pseudo_id, 
   d.bundle_id, 
   sum(if(f.user_pseudo_id is null, 0, 1)) as ad_finished_10_count,
   sum(if(dz.user_pseudo_id is null, 0, 1)) as day_0_count
from data d
left join finished_10 f on f.user_pseudo_id = d.user_pseudo_id
left join day_0_users dz on dz.user_pseudo_id = d.user_pseudo_id
group by 1,2

Надеюсь, это поможет.

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