Bigquery - 如何选择where子句中的字段而不是常量?

时间:2017-02-22 08:06:17

标签: sql google-bigquery

我是bigquery的新手,也是我SQL练习的早期版本。 我有一个SQL查询,其目标是恢复为特定域的特定国家/地区记录的总访问量。 该国家/地区由指定hits.customDimensions.index和hits.customDimensions.value以及页面主机的组合决定 我希望能够恢复各国的总访问量。但是我的下面的代码给出了每个国家完全膨胀的数字。任何人都可以帮助我进行狡猾的聚合吗?

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

1 个答案:

答案 0 :(得分:0)

请尝试以下BigQuery Legacy 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