【问题标题】:is there an easy way to generate a table_query based off of a timezone difference in BigQuery?有没有一种简单的方法可以根据 BigQuery 中的时区差异生成 table_query?
【发布时间】:2016-08-11 15:53:21
【问题描述】:

旧版 SQL

我正在使用 GBQ 的旧版 SQL 通过 TABLE_QUERY 函数动态查询表。我根据CURRENT_TIMESTAMP动态生成要查询的表名。例如,我从按季度分区的表中(即 mydataset.hit_data_[1-4])中过去 14 天的命中数据中选择设备。

标准 SQL

我需要将时区转换为 PST。 GBQ 标准 SQL 有TIME ZONE 转换。切换到标准 SQL,我可以使用 GBQ 标准 SQL 转换时区。但是,如果我现在尝试在同一个查询中使用 TABLE_QUERY 来执行我在 Legacy SQL 版本中所做的事情,我会得到:

Error: Table-valued functions are not supported

同时使用

有没有办法两全其美?如果前 14 天与 Q3 重叠,我想根据 Q4 的当前时间戳查询 mydataset.hit_data_3 和 mydataset.hit_data_4。

SELECT device FROM TABLE_QUERY(mydataset, 'table_id = CONCAT(\"hit_data_\", STRING(QUARTER(TIMESTAMP(CURRENT_TIMESTAMP, "America/Los_Angeles")))) OR table_id = CONCAT(\"hit_data_\", STRING(QUARTER(DATE_ADD(TIMESTAMP(CURRENT_TIMESTAMP, "America/Los_Angeles"), INTERVAL -14 DAY)))) ') WHERE DATE(date_time) BETWEEN DATE(DATE_ADD(TIMESTAMP(CURRENT_TIMESTAMP, 'America/Los_Angeles'), INTERVAL -14 DAY)) AND DATE(CURRENT_DATE()) ;

看起来很丑,但在GBQ中应该是有效的。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    标准 SQL 不支持 TABLE_QUERY 或 TABLE_DATE_RANGE 函数。相反,它支持带有特殊伪列 _TABLE_SUFFIX 的通配符表:

    您应该能够在 _TABLE_SUFFIX 伪列上使用 WHERE 子句重写您的查询

    https://cloud.google.com/bigquery/docs/querying-wildcard-tables

    【讨论】:

    • 谢谢,帕万。有没有关于这是否会支持某一天的观点的消息?
    • 您能简单介绍一下以这种方式查询多个视图的用例吗?您能否定义一个通过在视图定义本身内部使用 _TABLE_SUFFIX 上的过滤器来实现此目的的单个视图?
    • 我认为我们可以定义一个使用 _TABLE_SUFFIX 的单个视图,但目前我们表的命名约定将 _v 附加到原始 table_name。所以 _TABLE_SUFFIX 匹配表名* 会无意中匹配所有视图并报错。
    【解决方案2】:

    对于 BigQuery 标准 SQL,您应该使用 _TABLE_SUFFIX 伪列,该列允许您选择要从中查询的表

    下面是前进的方向

    SELECT * 
    FROM `mydataset.hit_data_*` 
    WHERE (_TABLE_SUFFIX = STRING(QUARTER(TIMESTAMP(CURRENT_TIMESTAMP, "America/Los_Angeles")))
    OR _TABLE_SUFFIX = STRING(QUARTER(DATE_ADD(TIMESTAMP(CURRENT_TIMESTAMP, "America/Los_Angeles"), INTERVAL -14 DAY)))
    )
    AND DATE(date_time) BETWEEN 
          DATE(DATE_ADD(TIMESTAMP(CURRENT_TIMESTAMP, 'America/Los_Angeles'), INTERVAL -14 DAY)) 
        AND DATE(CURRENT_DATE())
    

    注意:您需要确保您使用的是标准 SQL 支持的函数
    例如,而不是

    QUARTER(TIMESTAMP(...))   
    

    你应该使用

    EXTRACT(QUARTER FROM TIMESTAMP(...))
    

    【讨论】:

      猜你喜欢
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      相关资源
      最近更新 更多