BigQuery: воссоздать сегменты GA на основе целевой страницы - несовместимые показатели - PullRequest
0 голосов
/ 05 октября 2018

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

Следующий запрос работает отлично, и результаты Google Analytics точно отображаются:

SELECT
  SUBSTR(date,1,6) AS date,
  CASE
    WHEN REGEXP_CONTAINS(trafficSource.medium, r'^(cpc|ppc|cpa|cpm|cpv|cpp|display)') THEN 'paid'
    WHEN trafficSource.medium LIKE 'organic' THEN 'organic'
    WHEN trafficSource.medium LIKE '(none)' THEN 'direct'
    WHEN trafficSource.medium LIKE 'referral' THEN 'referral'
    WHEN trafficSource.medium LIKE 'social' THEN 'social'
    ELSE 'other'
  END AS segment,
  COALESCE(totals.newVisits, 0) = 1 AS first_visit,
  device.deviceCategory AS device,
  COUNT(DISTINCT fullVisitorId) AS users,
  SUM(totals.visits) AS sessions,
  SUM(totals.pageviews) AS pageviews,
  COUNT(totals.bounces) AS bounces,
  SUM(totals.timeOnSite) AS session_duration,
  SUM(totals.transactions) AS transactions,
  SUM(totals.totalTransactionRevenue)/1000000 AS revenue
FROM
  `xxxxxxxxxxx.ga_sessions_20180930`
GROUP BY
  1,2,3,4

Как выКак видите, запрос работает отлично для всех сегментов, основываясь только на trafficSource.medium .Моя проблема заключается в том, что мне нужно создавать сегменты на основе целевой страницы .

Я присоединился к исходной таблице с помощью подзапроса для получения необъявленных целевых страниц (см. Запрос ниже -> дополнительныйизмерения и метрики удалены для простоты).

Эта стратегия не работает: теперь все мои метрики, такие как сессий , перестали совпадать с метриками в Google Analytics.

SELECT
  CASE
    WHEN REGEXP_CONTAINS(trafficSource.medium,  
r'^(cpc|ppc|cpa|cpm|cpv|cpp|display)') THEN 'paid'
    WHEN trafficSource.medium LIKE 'organic' AND landing_blog LIKE 'not blog' THEN 'organic not blog'
    WHEN trafficSource.medium LIKE 'organic' AND landing_blog LIKE 'blog' THEN 'organic landing blog'
    WHEN trafficSource.medium LIKE '(none)' THEN 'direct'
    WHEN trafficSource.medium LIKE 'referral' THEN 'referral'
    WHEN trafficSource.medium LIKE 'social' THEN 'social'
    ELSE 'other'
  END AS segment,
  SUM(totals.visits) AS sessions
FROM
  `xxxxxxxxxxxx.ga_sessions_20180930` AS ga
JOIN (
  SELECT
    visitId,
    CASE
      WHEN REGEXP_CONTAINS(hits.page.pagePath,  r'^/blog/') THEN 'blog'
      ELSE 'not blog'
    END AS landing_blog
    -- Uses the knowledge that hits are stored in chronological order
  FROM
    `xxxxxxxxxxxx.ga_sessions_20180930`,
    UNNEST (hits) AS hits
  WHERE
    hits.hitNumber = 1
    AND hits.type LIKE 'PAGE') AS landing
ON
  ga.visitId = landing.visitId
GROUP BY 1

IБуду признателен за любую помощь в исправлении второго запроса или предложении другой стратегии.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

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

В данный момент вы фильтруете попадания по условиям сегмента.Поскольку данные сеанса сохраняются при попаданиях, у вас не будет никаких проблем, и они будут вести себя как сегментный сеанс в интерфейсе GA.

Но, если вы будете делать то же самое с, скажем, событиямиили попробуйте создать сегмент GA, основанный на пользователях (например, источник / среда с первого посещения), тогда ваше решение потерпит неудачу.Это также будет неэффективным, если у вас есть внутренняя ссылка на веб-сайт с параметрами utm (вы увидите только первую часть сеанса, которая повлияет на ваши показатели и коэффициенты).

Я предлагаю вам выполнитьследующее:

  1. Создание представления, которое определяет сегмент и возвращает только все идентификаторы сеанса или идентификаторы пользователей (если вы используете сегменты GA, основанные на пользователях), которые принадлежат сегменту
  2. Создайте запрос показателей / производительности и добавьте к предложению where, что идентификаторы сеансов или идентификаторы пользователей должны присутствовать в представлении.Или вы можете реализовать это с помощью JOIN и оператора case.

Таким образом, у вас есть очень многоразовый и модульный запрос, где фильтр определяется в одном месте, а метрики - в другом.Если вы хотите добавить больше сегментов, это легко.Если вы хотите изменить один сегмент, это также просто

0 голосов
/ 08 октября 2018

Кто-то с работы помог мне найти ошибку.Вот последний запрос:

SELECT
  SUBSTR(date,1,6) AS date,
  CASE
    WHEN REGEXP_CONTAINS(trafficSource.medium, r'^(cpc|ppc|cpa|cpm|cpv|cpp|display)') THEN 'paid'
    WHEN trafficSource.medium LIKE 'organic'
  AND landing_blog LIKE 'not blog' THEN 'organic not blog'
    WHEN trafficSource.medium LIKE 'organic' AND landing_blog LIKE 'blog' THEN 'organic landing blog'
    WHEN trafficSource.medium LIKE '(none)' THEN 'direct'
    WHEN trafficSource.medium LIKE 'referral' THEN 'referral'
    WHEN trafficSource.medium LIKE 'social' THEN 'social'
    ELSE 'other'
  END AS segment,
  COALESCE(totals.newVisits, 0) = 1 AS first_visit,
  device.deviceCategory AS device,
  COUNT(DISTINCT ga.fullVisitorId) AS users,
  SUM(totals.visits) AS sessions,
  SUM(totals.pageviews) AS pageviews,
  COUNT(totals.bounces) AS bounces,
  SUM(totals.timeOnSite) AS session_duration,
  SUM(totals.transactions) AS transactions,
  SUM(totals.totalTransactionRevenue)/1000000 AS revenue
FROM
  `xxxx.ga_sessions_2018*` AS ga
LEFT JOIN (
  SELECT
    visitId,
    fullVisitorId,
    CASE
      WHEN REGEXP_CONTAINS(hits.page.pagePath, r'^/blog/|^/lab/') THEN 'blog'
      ELSE 'not blog'
    END AS landing_blog
  FROM
    `xxxxx.ga_sessions_2018*`,
    UNNEST (hits) AS hits
  WHERE
    hits.isEntrance = TRUE) AS landing
ON
  ga.visitId = landing.visitId
  AND ga.fullVisitorId = landing.fullVisitorId
GROUP BY
  1, 2, 3, 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...