Как добавить правильный платфом (hit.datasource) в таблицу в BigQuery? - PullRequest
0 голосов
/ 30 апреля 2018

Я использую BigQuery с экспортированными данными из Google Analytics. Попытка добавить платформу в отчет на уровне сеанса (не знаю, как правильно назвать это измерение, но в основном мне нужно разделить «приложение» и «веб», поэтому «тип устройства» недостаточно).

Я пытаюсь использовать hits.datasource, но есть одна проблема. Это не совсем измерение уровня сеанса. Я имею в виду, что это так, но из-за специфики отслеживания в моей компании иногда есть несколько разных источников данных для одного сеанса.

Итак, вот полный сценарий, над которым я сейчас работаю:

#standardSQL
SELECT
  'DE' as Country,
  FORMAT_DATE("%d.%m.%Y", PARSE_DATE("%Y%m%d",date)) AS Date,
  channelGrouping AS Channel,
  trafficSource.medium as Medium,    
  trafficSource.source as Source,    
  trafficSource.campaign as Campaign,    
  hits[OFFSET(0)].datasource AS Platform, -- part I'm struggling with -- 
  device.deviceCategory as Device,
  CASE WHEN device.operatingSystem ='iOS' OR device.operatingSystem ='Android' then device.operatingSystem else 'Other' END as OS,
  CASE WHEN SUM(totals.visits)>0 THEN SUM(totals.visits) ELSE 0 END AS Sessions,
  CASE WHEN SUM(totals.totalTransactionRevenue)>0 THEN SUM(totals.totalTransactionRevenue)/POW(10,6) ELSE 0 END AS Revenue,
  CASE WHEN SUM(totals.transactions)>0 THEN SUM(totals.transactions) ELSE 0 END AS Orders,
  CASE WHEN SUM(totals.pageviews) >0 then SUM(totals.pageviews) ELSE 0 END as Pageviews,
  CASE WHEN SUM(totals.screenviews) >0 then SUM(totals.screenviews) ELSE 0 END as Screenviews,
  CASE WHEN SUM(totals.bounces) >0 then SUM(totals.bounces) ELSE 0 END as Bounces 
FROM
  `oval-unity-88908.97525772.ga_sessions_*` t
GROUP BY 1,2,3,4,5,6,7,8,9

Я оставил hits[OFFSET(0)].datasource как временную замену, но я бы хотел поместить туда наиболее используемый источник данных в сеансе.

Вот пара моих попыток заменить эту строку кода. Ничего еще не сработало.

(SELECT ht.datasource FROM (SELECT datasource, SUM(t.totals.hits) FROM t.hits GROUP BY 1 ORDER BY 2 DESC LIMIT 1) ht) AS Platfrom,

.

(SELECT ht.datasource FROM (SELECT datasource, COUNT(1) FROM t.hits GROUP BY 1 ORDER BY 2 DESC LIMIT 1) ht) AS Platfrom,

.

(SELECT hits.datasource FROM UNNEST(t.hits) ORDER BY hits.hitNumber LIMIT 1) AS Platform,

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

Ответы [ 2 ]

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

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

SELECT
  (SELECT datasource FROM t.hits GROUP BY 1 ORDER BY COUNT(1) DESC limit 1) mostFrequDatasource
  ,(SELECT STRING_AGG(DISTINCT datasource) FROM t.hits) allDataSources
  ,SUM(totals.visits) sessions
FROM
  `ga_sessions` t
GROUP BY 1,2

Для тестирования я добавил 'allDataSources', показывающий все источники данных, появляющиеся в сеансе.

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

Ваша последняя попытка была правильно с использованием UNNEST, но вам также нужно выполнить JOIN с таблицей:

FROM UNNEST(t.hits) JOIN t
...