BigQuery: отфильтруйте попадания по размеру попадания и области действия продукта - PullRequest
0 голосов
/ 23 декабря 2018

В BigQuery есть запрос на основе Google Analytics, как указано ниже, и он работает правильно.

#standard sql   
SELECT
      Date,
      SUM(totals.visits) AS Sessions,
      SUM(totals.transactions) AS Transactions
    FROM
      `[projectID].[DatasetID].ga_sessions_*`
    WHERE
      _TABLE_SUFFIX BETWEEN '20181217'
      AND '20181217'
      AND totals.visits > 0
    GROUP BY
      Date

В этом запросе мне нужно исключить все попадания, где в пределах попадания ...

  • .. Пользовательское измерение # 23 GA (попадание-scope) содержит значение «редактор» ИЛИ
  • .. Пользовательское измерение GA № 6 (область действия продукта) соответствует значению регулярного выражения '^ 63 ..... $' ИЛИ ​​
  • ..GA hit.page.pagePath соответствует значению регулярного выражения 'gebak | cake'

Примечание: не - намерение применить 3 условия, как указано выше, на уровне сеанса (как в на этом скриншоте ), но на уровне попаданий, поскольку я хотел бы воспроизвести числа из другого представления GA, а не представления, из которого данные загружаются в BigQuery.В этом другом представлении GA три условия, как указано выше, задаются в качестве фильтров представления.

На данный момент «лучшим» запросом является следующий запрос (на основе сообщения Мартина Вейцмана ниже).Однако набор данных не фильтруется в этом запросе (другими словами, условия не работают).

SELECT Date, 
-- hits,
SUM(totals.transactions), 
SUM(totals.visits) 

FROM (

(
  SELECT date, totals,
    -- create own hits array
    ARRAY(
      SELECT AS STRUCT 
        hitnumber, 
        page,
        -- create own product array
        ARRAY(
          SELECT AS STRUCT productSku, productQuantity 
          FROM h.product AS p
          WHERE (SELECT COUNT(1)=0 FROM p.customDimensions WHERE index=6 AND value like '63%') 
        ) AS product
      FROM t.hits as h
      WHERE 
        NOT REGEXP_CONTAINS(page.pagePath,r'gebak|cake')
        AND
        (SELECT COUNT(1)=0 FROM h.customDimensions WHERE index=23 AND value like '%editor%')
    ) AS hits
  FROM
    `[projectID].[DatasetID].ga_sessions_*` t
  WHERE 
  _TABLE_SUFFIX BETWEEN '20181217'
  AND '20181217'
  AND totals.visits > 0
  ))
  GROUP BY Date

Кто-нибудь знает, как достичь желаемого результата?

Большое спасибозаранее!

Примечание: projectID и datasetID были замаскированы в обоих запросах из-за проблем конфиденциальности.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Подход к собственным массивам

Вы можете создавать свои собственные хиты и массивы продуктов, используя подзапросы к оригиналу и передавая их результаты обратно в функции массива.В этих подзапросах вы можете отфильтровать свои хиты и продукты:

#standardsql
SELECT
  date,
  hits
  --SUM(totals.visits) AS Sessions,
  --SUM(totals.transactions) AS Transactions
FROM
  (
  SELECT 
    date, totals,
    -- create own hits array
    ARRAY(
      SELECT AS STRUCT 
        hitnumber, 
        page,
        -- create own product array
        ARRAY(
          SELECT AS STRUCT productSku, productQuantity 
          FROM h.product AS p
          WHERE (SELECT COUNT(1)=0 FROM p.customDimensions WHERE index=6 AND value like '63%') 
        ) AS product
      FROM t.hits as h
      WHERE 
        NOT REGEXP_CONTAINS(page.pagePath,r'gebak|cake')
        AND
        (SELECT COUNT(1)=0 FROM h.customDimensions WHERE index=23 AND value like '%editor%')
    ) AS hits
  FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_20161104` t
  )
--GROUP BY 1
LIMIT 100

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

Подход сегментации

Я думаю, что вам просто нужен правильный подзапрос в вашем WHERE утверждении:

#standardsql
SELECT
  date,
  SUM(totals.visits) AS Sessions,
  SUM(totals.transactions) AS Transactions
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*` t
WHERE
  (SELECT COUNT(1)=0 FROM t.hits h
    WHERE 
      (SELECT count(1)>0 FROM h.customDimensions WHERE index=23 AND value like '%editor%')
      OR
      (SELECT count(1)>0 from h.product p, p.customdimensions cd WHERE index=6 AND value like '63%')
      OR
      REGEXP_CONTAINS(page.pagePath,r'gebak|cake')
  )
GROUP BY date

Поскольку все ваши группы находятся на уровне сеанса, вы нене нужно никакого выравнивания (соответственно, перекрестных соединений с массивами) на главном столе, что является дорогостоящим.В самом внешнем WHERE вы вводите массив hits с подзапросом - это как для каждого в строках.Здесь вы уже можете сосчитать случаи REGEXP_CONTAINS(page.pagePath,r'gebak|cake').

. В остальных случаях вы снова пишете подзапрос для ввода соответствующего массива - в первом случае customDimensions в пределах hits.Это как вложенный for-each внутри другого (подзапрос в подзапросе).

Во втором случае я просто сглаживаю - но только внутри подзапроса: product с его customDimensions,Так что это одноразовое вложение для каждого, потому что я был ленивым и перекрестным.Я мог бы написать другой подзапрос вместо перекрестного соединения, так что в основном для каждого вложенного с тройным вложением (подзапрос в подзапросе в подзапросе).

Поскольку я считаю случаи, которые хочу исключитьМое внешнее состояние - COUNT(1)=0.

. Я мог проверить его только с помощью данных выборки ... так что это не проверено.Но я думаю, вы поняли.

0 голосов
/ 23 декабря 2018

Просто краткий пример / идея о том, как использовать WITH и REGEXP_EXTRACT в общедоступном наборе

WITH CD6 AS (
SELECT cd.value, SUM(totals.visits) AS Sessions6Sum
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`,
   UNNEST(hits) AS hits,
   UNNEST(hits.product) AS prod,
   UNNEST(prod.customDimensions) AS cd
   WHERE cd.index=6 
   AND NOT REGEXP_CONTAINS(cd.value,r'^63.....$')
   GROUP BY cd.value
),
CD23 AS (
SELECT cd.value, SUM(totals.visits) AS Sessions23Sum
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`,
   UNNEST(hits) AS hits,
   UNNEST(hits.product) AS prod,
   UNNEST(prod.customDimensions) AS cd
   WHERE cd.index=23 
   AND NOT REGEXP_CONTAINS(cd.value,r'editor')
   GROUP BY cd.value
)

select CD6.Sessions6Sum + CD23.Sessions23Sum from CD6, CD23

Вы можете получить дополнительную информацию о том, как использовать REGEXP_EXTRACT на официальном bigQuery API-странице

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