2014-10-29 69 views
7

對不起,我覺得我已經陷入死衚衕,因爲我對SQL的瞭解還沒有那麼深。在GA的BigQuery集成上選擇不同的customDimensions

從BigQuery的實施Google分析原始數據出來的數據是這樣的:

|-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
  • LEFT JOIN 43與24 43.visitId == 24.visitId和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 

運行此查詢需要太多的時間,我創建結果的propper儀表板。

所以幫助我,如果這是我的最終結果。我覺得應該有一個更好的解決方案來解決這個問題,但我似乎無法親自找到它。

幫助?

+0

也許這是要走的路。 – Datasetter 2014-10-29 12:15:09

回答

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 

的例子顯示了三個WITHIN RECORD聚合,這意味着他們將被計算過的重複場單一記錄。 SOME()採用布爾表達式,如果記錄中的任何字段滿足該表達式,則返回true。因此,對於有customDimensions.index = 43的一個或多個匹配的訪問,43有效.HAVING子句篩選出記錄爲false的記錄。

SUM(IF(...))表達式計算index = 24和value ='ficha'的customDimensions總數以及與index = 14的customMetrics關聯的總數值。

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