2014-10-29 11 views
7

Przepraszamy za konkretne pytanie, ale czuję, że trafiłem w ślepy zaułek, ponieważ moja znajomość SQL nie posuwa się tak daleko.Wybieranie różnych customDimensions w integracji BigQuery GA

Dane, które wychodzi z realizacji BigQuery z Google Analytics surowych danych wygląda następująco:

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

Wiem, że są przeboje, które zawsze wysłać jakieś dane do GA. W szczególności chcę customDimensions.index = 43, customDimensions.index = 24 i customMetrics.index = 14. Aby określić, Wymiar 43 jest obiektem widzianym lub sprzedawanym, wymiar 24 mówi mi, czy są widoczne i metryczne 14, wartość ma 1, gdy została właśnie sprzedana. Mój wynik końcowy powinien wyglądać następująco:

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

Zgrupowane przez customDimension.value (gdy indeks = 43) wiem, że za każdym razem, że hitem jest wysyłany z customMetrics.index = 14, to samo uderzenie ma customDimensions. index = 43, w ten sam sposób customDimensions.index = 24 ma zawsze customDimensions.index = 43. Rzeczywiście udało mi się stworzyć SQL, który robi to, co chcę, ale jakim kosztem? Jest duży, jest powolny, brzydki. Co mam aktualnie robi to:

  • Utwórz trzy stoliki, wszyscy mający visitId, hit.time i wartość, gdy indeks = 14,24,43
  • LEFT JOIN 43 z 24 na 43.visitId == 24.visitId AND 43.hits.time == 24.hits.time jako wynik
  • Lewy wynik połączenia z 14 ON 14.visitId == result.visitId AND 14.hits.time == result.hits.time

Nie interesuje mnie ani visitId ani hits.time, to tylko sposób na odniesienie tych samych trafień (i wiedzieć, który produkt kupili, gdy customMetrics.index = 14 i value = 1 .

To jest mój kod:

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 

Uruchomienie tego zapytania zajmuje zbyt wiele czasu dla mnie, aby stworzyć pulpit Właściwa z wyników.

Więc pomóż mi, Boże, jeśli to mój ostateczny wynik. Czuję, że powinno być DROGI bardziej eleganckim rozwiązaniem tego problemu, ale nie mogę go znaleźć na własną rękę.

Pomoc?

+0

Może to jest droga. – Datasetter

Odpowiedz

4

Powinieneś być w stanie ustrukturyzować tę kwerendę bez łączenia za pomocą agregacji o zasięgu BigQuery (the WITHIN clause). Oto mały przykład, który nie może być dokładnie taka logika chcesz, ale powinien zilustrować niektóre z możliwości:

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 

Przykład pokazuje trzy WŚRÓD agregacji rekord, co oznacza, będą obliczane na powtarzające polach pojedynczy rekord. SOME() pobiera wyrażenie binarne i zwraca wartość true, jeśli dowolne pole w rekordzie spełnia to wyrażenie. Tak więc has43 będzie prawdziwe dla odwiedzin, które mają jedno lub więcej trafień z customDimensions.index = 43. Klauzula HAVING odfiltrowuje rekordy, w których jest to fałsz.

Wyrażenia SUM (IF (...)) obliczają całkowitą liczbę customDimensions z index = 24 i value = 'ficha oraz całkowitą wartość związaną z customMetrics z index = 14.

0

Jeśli chcesz po prostu uzyskać wartość z hitLevel customDimension i dodać go do własnej kolumny o to schludny trick:

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