Время большого запроса между двумя конкретными посещениями страницы Google Analytics - PullRequest
0 голосов
/ 25 сентября 2019

Сейчас здесь.Я пытаюсь найти среднее время, затрачиваемое пользователями на нашем сайте, чтобы перейти с одной страницы (получение цитаты) на другую (подача заявки).Использование данных Google Analytics в BigQuery.Я хотел бы разделить это по каналам, но изначально я просто пытаюсь определить время для каждого пользователя.

Я пробовал внутреннее и левое соединение, но оба возвращают таблицу * Таблица результатовОба подзапроса выглядят корректно при запуске по отдельности (кавычки возвращают 925, приложения возвращают 117), но при присоединении к ним я получаю дубликаты.

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

-- SELECT
--   channelGrouping,
--   ROUND(AVG(timeQ2A/60000),2) AS avgMinsQ2A
-- FROM (

   SELECT
    CONCAT(CAST(visitId AS STRING),'_',fullVisitorId) AS sessionId,
    apps.channelGrouping,
    (quote.quoteTime) as quoteTime,
    (CAST(hits.time AS INT64)) AS appTime,
    (CAST(hits.time AS INT64) - (quote.quoteTime)) AS timeQ2A
  FROM
    `project.dataset.ga_sessions_20190923` AS apps,
    UNNEST(hits) AS hits
  INNER JOIN (
    SELECT
     MIN(CAST(hits.time AS INT64)) AS quoteTime,
     CONCAT(CAST(visitId AS STRING),'_',fullVisitorId) AS sessionId     
    FROM
      `project.dataset.ga_sessions_20190923`,
      UNNEST(hits) AS hits
    WHERE
      hits.type = "PAGE"
      AND hits.page.pagePath = "/get-a-quote/"
      AND hits.time > 0 
    GROUP BY
    2) AS quote
  ON
    sessionId = quote.sessionId
  WHERE
    hits.type = "PAGE"
    AND hits.page.pagePath = "/application-complete/"
  GROUP BY
    1,
    2,3,4
ORDER BY 1,2,3
--     )
-- GROUP BY
--   1
-- ORDER BY 
--   2 DESC

Я ожидал бы получить только 117 строк (все пользователи, которые подали заявки, будут в таблице котировок, поэтому внутренние и левые должны быть одинаковыми), но я получаю 108k.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 25 сентября 2019

Если бы мне пришлось угадывать, я бы сказал, что у вас есть несколько обращений за сеанс, где hits.page.pagePath = "/application-complete/" - это правда.Вы берете минимум метки времени в своем внутреннем запросе, но не ваш внешний запрос.

Если бы это был я, я бы структурировал свой запрос следующим образом:

-- Get all relevant GA Data
with ga as (
  select
    CONCAT(CAST(visitId AS STRING),'_',fullVisitorId) AS sessionId,
    channelGrouping,
    hits.time as hit_ts,
    hits.page.pagePath
  from `project.dataset.ga_sessions_20190923`
  left join unnest(hits) AS hits
  where hits.type = 'PAGE' and hits.page.pagePath in ('/get-a-quote/','/application-complete/') and hits.time > 0
),
-- Get first instance of quote
first_quote as (
  select
    sessionId,
    channelGrouping,
    min(hit_ts) as quote_ts
  from ga
  where pagePath = '/get-a-quote/'
  group by 1,2
),
-- Get first instance of app-complete
first_app_complete as (
  select
    sessionId,
    channelGrouping,
    min(hit_ts) as app_complete_ts
  from ga
  where pagePath = '/application-complete/'
  group by 1,2
),
-- Join it all together and calc differences
joined as (
  select
    sessionID,
    channelGrouping,
    timestamp_diff(app_complete_ts, quote_ts, second) as ts_diff_seconds
  from first_quote
  inner join first_app_complete using(sessionID,channelGrouping)
)
select * from joined
-- select channelGrouping, count(sessionID) as session_count, avg(ts_diff_seconds) as average_seconds_to_complete from joined group by 1
...