2017-02-22 24 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

Отличное объяснение - thenk you. Я понимаю, что я смешивал подробности данных здесь! –

ответ

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

извините, Михаил - спасибо за подсказку –