【问题标题】:TABLE_DATE_RANGE for xxxx_yyyymm format tablesxxxx_yyyymm 格式表的 TABLE_DATE_RANGE
【发布时间】:2016-06-13 14:02:26
【问题描述】:

我在尝试查询 15 个月的数据时遇到问题。 我知道 bigquery 的通配符函数,但我似乎无法让它们与我的表一起使用。

例如,如果我的表被调用:

xxxx_201501,
xxxx_201502,
xxxx_201503,
...
xxxx_201606

如何选择从 201501 到今天 (current_timestamp) 的所有内容?

看来每天都要有桌子,我错了吗?

我还读到您可以使用regex,但找不到路。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    使用标准 SQL,您可以在 _TABLE_SUFFIX 伪列上使用 WHERE 子句,如下所述:

    Is there an equivalent of table wildcard functions in BigQuery with standard SQL?

    在这种特殊情况下,它将是:

    SELECT ... from `mydataset.xxx_*` WHERE _TABLE_SUFFIX >= '201501';
    

    【讨论】:

    • 如果这行得通,它将证明对我非常有用。谢谢。
    • 你就是男人!谢谢一堆。很遗憾,由于我必须更改我的查询,所以我无法让它与旧版 SQL 一起使用,但这已经足够了。非常感谢!
    【解决方案2】:

    评论有点长。

    如果您使用的是标准 SQL 方言,那么我认为该功能尚未实现。

    如果您使用的是旧版 SQL 方言,则可以使用 TABLE_DATE_RANGE() 等函数。这个和其他表通配符函数都很好documented

    编辑:

    哦,我明白了。最简单的方法是将表存储为 YYYYMM01,以便您可以使用范围查询。

    但是,你也可以使用table_query()

    from table_query(t, 'right(table_id, 6) >= ''201501'' ')
    

    【讨论】:

    • 我确实在使用旧版 SQL。我知道函数“TABLE_DATE_RANGE()”,并且我已经正确阅读了文档。但似乎它们只对日常表有用,例如 xxxx_20160601、xxxx_20160602 等。这就是我问的原因!任何解决方法?谢谢!
    • 第二个参数只需使用CURRENT_TIMESTAMP() 或类似的东西。
    • 好的。我可能没有很好地解释自己。看起来 TABLE_DATE_RANGE 函数仅适用于 DAILY 表,例如 table_nameYYYYmmdd,而不是 table_nameYYYYmm(就像我的一样),因此每次我尝试使用 table_date_range 函数时都会发生此错误:“带有表通配符的 FROM 子句不匹配任何表”,因为它不是匹配其中任何一个。
    • 正如我在文档中看到的“表名必须具有以下格式:,其中 的格式为 YYYYMMDD。”我只是要求解决此问题,例如找到大于 201501 的数字的正则表达式。
    • Pavan 的方法很有效。但是标准 SQL 不允许我使用传统 SQL 所使用的 json 函数。我会尝试你的方法,希望它有效,我也可以使用 json_extract 例如。非常感谢你们。很快就会回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多