2017-02-22 66 views
1

我是新來的bigquery,在我的SQL旅程中也相當早。 我有一個SQL查詢,其目的是爲了恢復爲特定域的特定國家/地區記錄的總訪問次數。 該國家由指定hits.customDimensions.index和hits.customDimensions.value以及頁面主機 的組合決定,我希望能夠按國家/地區回訪總訪問次數。但是,我的代碼給出了我的每個國家的完全膨脹的數字。任何人都可以幫我用我狡猾的聚合?下面Bigquery - 我如何選擇我的where子句中的字段而不是常量?

SELECT 
date, 
hits.customDimensions.index, 
hits.customDimensions.value, 
SUM(totals.visits) AS totals_visits 

FROM (TABLE_DATE_RANGE([95212100.ga_sessions_], DATE_ADD(CURRENT_TIMESTAMP(), -1, 'MONTH'), DATE_ADD(CURRENT_TIMESTAMP(), -1, 'DAY'))) 

WHERE 
hits.page.hostname = 'www.xxxx.com' AND ((hits.customDimensions.index=5 
AND hits.customDimensions.value='US') OR (hits.customDimensions.index=5 
AND hits.customDimensions.value='UK') OR ((hits.customDimensions.index=5 
AND hits.customDimensions.value='India'))) 

GROUP BY date, hits.customDimensions.index, hits.customDimensions.value 
+0

查詢看起來不錯,唯一的原因爲什麼totals_visits會被誇大,如果每次訪問都有多個hits.customDimensions - 那麼它將被這個查詢多次計數。 –

+0

優秀的解釋 - 請你。我意識到我在這裏混合數據的粒度! –

回答

0

嘗試使用BigQuery的傳統SQL

#legacySQL 
SELECT 
    date, val, SUM(visits) AS visits 
FROM (
    SELECT 
    date, 
    totals.visits AS visits, 
    l.value AS val, 
    MAX(hits.customDimensions.index = 5 
     AND hits.customDimensions.value = l.value 
    ) WITHIN RECORD AS flag 
    FROM (SELECT * FROM TABLE_DATE_RANGE([95212100.ga_sessions_], DATE_ADD(CURRENT_TIMESTAMP(), -1, 'MONTH'), DATE_ADD(CURRENT_TIMESTAMP(), -1, 'DAY'))) AS s 
    CROSS JOIN (-- Pre-Selected Countries Only 
    SELECT value FROM 
     (SELECT 'US' as value), 
     (SELECT 'UK' as value), 
     (SELECT 'India' as value) 
) AS l 
    WHERE hits.page.hostname = 'www.xxxx.com' 
    AND hits.customDimensions.index = 5 
    HAVING flag 
) 
GROUP BY date, val 

如果您需要輸出的所有國家 - 您可以使用下面的查詢

#legacySQL 
SELECT 
    date, val, SUM(visits) AS visits 
FROM (
    SELECT 
    date, 
    totals.visits AS visits, 
    l.value AS val, 
    MAX(hits.customDimensions.index = 5 
     AND hits.customDimensions.value = l.value 
    ) WITHIN RECORD AS flag 
    FROM (SELECT * FROM TABLE_DATE_RANGE([95212100.ga_sessions_], DATE_ADD(CURRENT_TIMESTAMP(), -1, 'MONTH'), DATE_ADD(CURRENT_TIMESTAMP(), -1, 'DAY'))) AS s 
    CROSS JOIN (-- All 'qualified' countries 
    SELECT hits.customDimensions.value AS value 
    FROM TABLE_DATE_RANGE([95212100.ga_sessions_], DATE_ADD(CURRENT_TIMESTAMP(), -1, 'MONTH'), DATE_ADD(CURRENT_TIMESTAMP(), -1, 'DAY')) 
    WHERE hits.page.hostname = 'www.xxxx.com' 
    AND hits.customDimensions.index = 5 
    GROUP BY value 
) AS l 
    WHERE hits.page.hostname = 'www.xxxx.com' 
    AND hits.customDimensions.index = 5 
    HAVING flag 
) 
GROUP BY date, val 
+0

如果答案有幫助,請考慮接受它 - 您可以使用投票下方發佈答案左側的勾號標記接受答案。看到http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235爲什麼它很重要! –

+0

對不起米哈伊爾 - 感謝您的提示 –