Большой запрос Google: получите новое число посетителей, используя пользовательское измерение - PullRequest
0 голосов
/ 01 мая 2018
select   PARSE_DATE('%Y%m%d', t.date) as Date
        ,count(distinct(fullvisitorid)) as User
       ,SUM( totals.newVisits ) AS New_Visitors
       ,(if(customDimensions.index=1, customDimensions.value,null))  as Orig
FROM `table` as t
CROSS JOIN UNNEST(hits) AS hit
CROSS JOIN UNNEST(hit.customDimensions ) AS customDimensions  
group by Date, orig

Есть ли способ получить новое количество посетителей и одновременно использовать customDimension? Сумма (total.newVisits) не работает.

Спасибо

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Лучший способ в вашем случае - удалить перекрестные объединения и использовать вместо этого подвыборы:

SELECT
  PARSE_DATE('%Y%m%d', t.date) AS Date
  ,(SELECT value FROM UNNEST(customDimensions) WHERE index=1) Orig
  ,COUNT(DISTINCT(fullvisitorid)) AS User
  ,SUM( totals.newVisits ) AS New_Visitors
FROM
  `table` t
GROUP BY Orig, Date

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

SELECT
  PARSE_DATE('%Y%m%d', t.date) AS Date
  ,(SELECT value FROM h.customDimensions WHERE index=2) justAHitCd
  ,h.page.pagePathLevel1
  ,COUNT(DISTINCT(fullvisitorid)) AS User

  -- create session id and count distinct
  ,COUNT(DISTINCT CONCAT(fullvisitorid, CAST(visitstarttime AS STRING)) ) AS all_sessions

  -- only count distinct session id of sessions where totals.newVisits = 1
  ,COUNT(DISTINCT 
    IF(totals.newVisits=1, 
      CONCAT(fullvisitorid, CAST(visitstarttime AS STRING)), 
      NULL )
   ) AS New_Visitors

FROM
  -- flatten table to hit scope (comma means cross-join in stnd sql)
  `table` t, t.hits h
GROUP BY 1,2,3

Таким образом, в случае новых посетителей я предоставляю идентификатор сеанса только если totals.newVisits = 1, иначе оператор if предоставляет NULL, который не может быть подсчитан.

Если у вас есть что-то похожее в области продукта, вам нужно создать идентификатор, учитывающий сеанс и ударить. Например. Подсчет страниц для товараСку:

SELECT
  PARSE_DATE('%Y%m%d', t.date) AS Date
  ,(SELECT value FROM h.customDimensions WHERE index=2) justAHitCd
  ,p.productSku
  ,COUNT(DISTINCT fullvisitorid) AS users
  ,COUNT(DISTINCT CONCAT(fullvisitorid, CAST(visitstarttime AS STRING))) AS sessions
  ,COUNT(DISTINCT 
    IF(h.type='PAGE',
      CONCAT(fullvisitorid, cast(visitstarttime AS STRING),CAST(hitNumber AS STRING)),
      NULL)  
  ) as pageviews
  ,COUNT(1) AS products
FROM
  `table` t, t.hits h LEFT JOIN h.product p
GROUP BY 1,2,3

Обратите внимание, что я остался присоединиться к массиву продуктов. Поскольку иногда оно пустое, перекрестное соединение уничтожит всю информацию о попаданиях: перекрестное объединение с пустой таблицей приводит к пустой таблице.

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

0 голосов
/ 01 мая 2018

Ниже для BigQuery Standard SQL

SELECT DATE 
  ,COUNT(DISTINCT(fullvisitorid)) AS User
  ,SUM( newVisits ) AS New_Visitors
  ,Orig
FROM (
  SELECT PARSE_DATE('%Y%m%d', t.date) AS DATE
    ,fullvisitorid
    ,totals.newVisits AS newVisits
    ,(IF(customDimensions.index=1, customDimensions.value,NULL))  AS Orig
  FROM `table` AS t
  CROSS JOIN UNNEST(hits) AS hit
  CROSS JOIN UNNEST(hit.customDimensions ) AS customDimensions  
  GROUP BY DATE, orig, fullvisitorid, newVisits
)
GROUP BY DATE, Orig
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...