BigQuery StandardSQL:使用_TABLE_SUFFIX的最近7天

Mal*_*erg 7 google-bigquery

问题:我想使用_TABLE_SUFFIX从多个Google Analytics会话表中提取数据,但我想将后缀参数设置为"七天前"和"一天前"之间(即提取最近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
Run Code Online (Sandbox Code Playgroud)

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

灵感:

BigQuery Cookbook有一个我基于此的遗留SQL示例:(https://support.google.com/analytics/answer/4419694?hl=zh-CN#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 
Run Code Online (Sandbox Code Playgroud)

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

使用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)'
Run Code Online (Sandbox Code Playgroud)

导致" 有效:此查询在运行时将处理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))'
Run Code Online (Sandbox Code Playgroud)

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

尝试跳过他在DATE_SUB条款周围连字符

WHERE
  _TABLE_SUFFIX BETWEEN 
  DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) AND
  DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
Run Code Online (Sandbox Code Playgroud)

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

提前致谢,

Mos*_*sky 14

Elliott的答案是正确的,但是如果你想从BigQuery中获得最大的性能来进行这种查询,而不是转换_TABLESUFFIXDATE,你应该将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))
Run Code Online (Sandbox Code Playgroud)


Ell*_*ard 7

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

WHERE
  PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) BETWEEN 
  DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) AND
  DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
Run Code Online (Sandbox Code Playgroud)