【问题标题】:BigQuery StandardSQL: Last 7 Days using _TABLE_SUFFIXBigQuery StandardSQL:过去 7 天使用 _TABLE_SUFFIX
【发布时间】:2017-11-29 22:52:42
【问题描述】:

问题:我想使用 _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

这给了我消息“有效:此查询在运行时将处理 0 B。”在我看来,语法没有错误,但 BigQuery 无法读取我的日期函数,因此无法将它们添加到 ga_sessions_* 通配符

灵感:

BigQuery Cookbook 有一个 legacySQL 示例,我一直以此为基础:(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)”

提前致谢,

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    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))
    

    【讨论】:

    • 谢谢!归功于 Elliot,但性能也是一个重要的角度,尤其是在处理大量数据时。更改为接受的答案。 (对于新读者,另请参阅我对 Elliott Brossards 回答有关通配符的小编辑的评论)
    • 我认为日期格式需要为“%Y%m%d”,因为大写字母 Y 输出 4 位数年份,而小写字母是 2 位数年份
    • @Elliott Brossard 的答案是正确的答案。我自己尝试过,但没有返回结果。但艾略特的回答对我有用。
    • 不确定这是否正确 - 当我对日期范围进行硬编码时 - 我似乎使用 ``` WHERE _TABLE_SUFFIX BETWEEN "20180708" and "20180715)``` 获得了不同的数据
    • 直到现在一直使用相同,但现在它显示 0 B 并且没有结果,现在可以在日期被硬编码时使用
    【解决方案2】:

    最后一次尝试时,您已经快到了。您需要将字符串转换为日期才能在比较中使用它:

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

    【讨论】:

    • 谢谢!您的建议导致另一个错误,但在对通配符进行了一些轻微编辑后工作。 (对新读者的解释:parse_date 无法处理 intradate 数据集,因此新通配符应为 projectname.123456789.ga_sessions_20*,解析日期应为 PARSE_DATE('%y%m%d', _TABLE_SUFFIX)非大写 y 获得 2 位数年份而不是 4 位数年份。)
    【解决方案3】:

    这适用于任何只想在大查询中分割出上周数据的人。只要您有时间戳,就适用于任何数据集!

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

    【讨论】:

      【解决方案4】:

      如果您还想包含今天的数据,请使用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())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-07
        • 2022-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多