2014-10-29 2 views
7

Извините за конкретный вопрос, но я чувствую, что я зашел в тупик, потому что мои знания SQL не уходят так далеко.Выбор различных customDimensions для интеграции BigQuery GA

данные, что выходит из реализации BigQuery из GoogleAnalytics необработанных данных выглядит следующим образом:

|-visitId 
|- date 
|- (....) 
+- hits 
    |- time 
    +- customDimensions 
     |- index 
     |- value 
    +- customMetrics 
     |- index 
     |- value 

Я знаю, что есть хиты, которые всегда посылают некоторые данные в GA. В частности, я хочу customDimensions.index = 43, customDimensions.index = 24 и customMetrics.index = 14. Чтобы указать, размер 43 - это объект, который просматривается или продается, размер 24 говорит мне, если они видны и метрические 14, значение имеет 1, когда оно только что было продано. Мой окончательный результат должен выглядеть следующим образом:

customDimension.value(when index=43) count(when customDimension.index=24 and customDimension.value=='ficha')  count(when customMetrics.index=14 and customMetrics.value ==1)) 

Группировать по customDimension.value (когда индекс = 43) Я знаю, что каждый раз, что хит отправляется с customMetrics.index = 14, то же попадание customDimensions. index = 43, то же самое, customDimensions.index = 24 всегда имеет customDimensions.index = 43. Мне действительно удалось создать SQL, который делает то, что я хочу, но по какой цене? Он большой, он медленный, он уродлив. То, что я сейчас делаю это:

  • Создайте три таблицы, все имеющие visitId, hit.time и значение, когда индекс = 14,24,43
  • Выравнивание по левому краю 43 с 24 по 43.visitId == 24.visitId AND 43.hits.time == 24.hits.time как результат
  • Результат левого соединения с 14 ON 14.visitId == result.visitId AND 14.hits.time == result.hits.time

Меня не интересует visitId или hits.time, это просто способ связать одни и те же хиты (и знать, какой продукт они купили, когда customMetrics.index = 14 и value = 1.

Это мой код:

SELECT Tviviendasvisitas.viviendaId as ViviendaID ,sum(Tviviendasvisitas.NumeroVisitas) as NumeroVisitas,sum(Ttransacciones.Transactions) as Transactions FROM (
SELECT Tviviendas.visitId as visitId, Tviviendas.hits.time as visitTime, Tviviendas.ViviendaID as viviendaId,Tvisitas.visitas as NumeroVisitas FROM (
SELECT visitId,hits.time,hits.customDimensions.value as ViviendaID FROM ((TABLE_DATE_RANGE([-------.ga_sessions_], TIMESTAMP('2014-09-01'), TIMESTAMP('2014-09-30')))) 
WHERE hits.customDimensions.index = 43 
GROUP EACH BY visitId,hits.time, ViviendaID)as Tviviendas 

LEFT JOIN EACH(
SELECT visitId,hits.time,count(*) as visitas FROM ((TABLE_DATE_RANGE([-------.ga_sessions_], TIMESTAMP('2014-09-01'), TIMESTAMP('2014-09-30')))) 
WHERE hits.customDimensions.index = 24 AND hits.customDimensions.value=='ficha' 
GROUP EACH BY visitId,hits.time) as Tvisitas 
ON Tvisitas.visitId==Tviviendas.visitId AND Tvisitas.time==Tviviendas.time) as Tviviendasvisitas 

LEFT JOIN EACH (
SELECT visitId ,hits.time as transactionTime, sum(hits.customMetrics.value) as Transactions FROM(TABLE_DATE_RANGE([-------.ga_sessions_], TIMESTAMP('2014-09-01'), TIMESTAMP('2014-09-30'))) 
WHERE hits.customMetrics.index = 14 AND hits.customMetrics.value=1 
GROUP BY visitId, transactionTime) as Ttransacciones 
ON Tviviendasvisitas.visitId==Ttransacciones.visitId AND Tviviendasvisitas.visitTime==Ttransacciones.transactionTime 
GROUP BY ViviendaID 

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

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

Помощь?

+0

Может быть, это путь. – Datasetter

ответ

4

Вы можете структурировать этот запрос без соединений с помощью агрегирования BigQuery с областью (the WITHIN clause). Вот небольшой пример, который не может быть точно логики вы хотите, но должны проиллюстрировать некоторые из возможностей:

SELECT visitId, hits.time, 
     SOME(hits.customDimensions.index = 43) WITHIN RECORD AS has43, 
     SUM(IF(hits.customDimensions.index = 24 AND hits.customDimensions.value = 'ficha', 1, 0)) WITHIN RECORD AS numFichas, 
     SUM(IF(hits.customMetrics.index = 14, hits.customMetrics.value, 0)) WITHIN RECORD AS totalValues 
FROM ((TABLE_DATE_RANGE([-------.ga_sessions_], TIMESTAMP('2014-09-01'), TIMESTAMP('2014-09-30')))) 
HAVING has43 

Данного пример показывает три ТЕЧЕНИЯ RECORD агрегатов, то есть они будут вычисляться по повторяющимся полям одиночный запись. SOME() принимает логическое выражение и возвращает true, если любое поле в записи удовлетворяет этому выражению. Таким образом, has43 будет истинным для посещений, которые имеют один или несколько обращений с customDimensions.index = 43. Предложение HAVING отфильтровывает записи, где это false.

Выражения SUM (IF (...)) вычисляют общее количество customDimensions с индексом = 24 и значением = 'ficha' и общие значения, связанные с customMetrics с индексом = 14.

0

Если вы просто хотите, чтобы получить значение из hitLevel customDimension и добавить его в свой столбец здесь аккуратный трюк:

SELECT fullVisitorId, visitId, hits.hitNumber, 
MAX(IF(hits.customDimensions.index=43, 
     hits.customDimensions.value, 
     NULL)) WITHIN hits AS product, 
FROM [tableID.ga_sessions_20150305] 
LIMIT 100 
Смежные вопросы