BigQuery StandardSQL:使用_TABLE_SUFFIX的最近7天

时间:2017-06-27 01:07:36

标签: google-bigquery

问题:我想使用_TABLE_SUFFIX从多个Google Analytics会话表中提取数据,但我希望将后缀参数设置为"七天前"和#34;一天前" (即提取最近7天的数据)

当前语法(不起作用):

#StandardSQL
SELECT
  date,
  SUM (totals.visits) AS visits
FROM
  `projectname.123456789.ga_sessions_*`
WHERE
  _TABLE_SUFFIX BETWEEN 
  'DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL -7 DAY)' AND 
  'DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY)'
GROUP BY 
   date
ORDER BY 
   date ASC

它给了我消息" 有效:此查询在运行时将处理0 B."在我看来,语法没有错误,但是BigQuery无法读取我的日期函数,因此无法将它们后缀为ga_sessions_ *通配符

启示:

BigQuery Cookbook有一个遗留SQL的例子,我一直基于这个例子:(https://support.google.com/analytics/answer/4419694?hl=en#7days

#LegacySQL
SELECT
  date,
  SUM (totals.visits) AS visits
FROM 
  (TABLE_DATE_RANGE([73156703.ga_sessions_], 
  DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY'), 
  DATE_ADD(CURRENT_TIMESTAMP(), -1, 'DAY')))
GROUP BY
  date
ORDER BY
  date ASC 

我尝试过的事情:(这不起作用)

使用DATE_SUB而不是DATE_ADD并使用CURRENT_DATE而不是CURRENT_TIMESTAMP:

WHERE
   _TABLE_SUFFIX BETWEEN 
   'DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)' AND 
   'DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)'

导致" 有效:此查询在运行时将处理0 B."

在DATE_SUB和CURRENT_DATE周围使用DATE_FORMAT以获取没有破折号的日期:

WHERE
   _TABLE_SUFFIX BETWEEN 
   'FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))' AND 
   'FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))'

导致" 有效:此查询在运行时将处理0 B."

尝试跳过他的连字符''围绕DATE_SUB条款

WHERE
  _TABLE_SUFFIX BETWEEN 
  DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) AND
  DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)

导致以下错误消息" 错误:参数类型的操作符BETWEEN没有匹配的签名:STRING,DATE,DATE。支持的签名:(ANY)BETWEEN(ANY)AND(ANY)"

提前致谢,

4 个答案:

答案 0 :(得分:8)

Elliott的回答是正确的,但是如果您想要从BigQuery中获得最佳性能来进行此类查询,而不是将_TABLESUFFIX转换为DATE,则应转换CURRENT_DATE个表达式字符串:

WHERE
  _TABLE_SUFFIX BETWEEN 
  FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)) AND
  FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))

答案 1 :(得分:5)

你的最后一次尝试几乎就在那里。您需要将字符串转换为日期才能在比较中使用它:

a

答案 2 :(得分:0)

这适用于任何希望在大查询中细分出最后一周的数据的人。只要有时间戳,即可用于任何数据集!

where TIMESTAMPFIELD >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)

答案 3 :(得分:0)

如果您还想包括今天的数据,请使用 intraday 表:

谷歌分析:docs

SELECT *
FROM `myproject.xxxxxxx.ga_sessions_*`
WHERE _TABLE_SUFFIX BETWEEN 
  FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)) AND
  FORMAT_DATE("intraday_%Y%m%d", CURRENT_DATE())

Google Analytics for Firebase: (docs)

SELECT *
FROM `myproject.analytics_xxxxxxx.events_*`
WHERE _TABLE_SUFFIX BETWEEN 
  FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)) AND
  FORMAT_DATE("intraday_%Y%m%d", CURRENT_DATE())