【问题标题】:Querying multiple tables in Big Query在 Big Query 中查询多个表
【发布时间】:2012-10-21 17:27:45
【问题描述】:

由于无法在 BigQuery 中更新表中的数据,并且仅支持追加机制,因此我决定每月创建新表。所以假设 2012 年的表格是(tbl_012012tbl_022012tbl_032012、...tbl_122012)。每条记录将与日期timestamp 一起存储为字符串。

现在,如果我的应用程序想要获取从 2012 年 1 月 (tbl_012012) 到 2012 年 3 月 (tbl_032012) 的记录,BigQuery API 将通过单个 SQL 范围查询自动遍历所需的表,还是我必须编写多个 SQL 查询以及额外的应用程序代码来检索每个查询结果,然后将它们聚合在一起?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    您还可以使用表通配符函数。这是来自 docs 的 StandardSQL 示例:

    SELECT 
      name
    FROM 
      mydata.people
    WHERE 
      age >= 35
      AND
      (_TABLE_SUFFIX BETWEEN '20140325' AND '20140327')
    

    这是 LegacySQL (docs) 的类似示例。

    SELECT 
      name
    FROM 
      (TABLE_DATE_RANGE([mydata.people], 
                    TIMESTAMP('2014-03-25'), 
                    TIMESTAMP('2014-03-27'))) 
    WHERE 
      age >= 35
    

    这将查询表:

    • mydata.people20140325
    • mydata.people20140326
    • mydata.people20140327

    docs 上还有一些其他选项。我建议检查一下。

    【讨论】:

    • 201601表格的月份范围也可以查询吗?
    【解决方案2】:

    一个 SQL 查询可以引用多个表。只需在 FROM 子句中用逗号分隔每个表,即可查询所有提到的表。

    【讨论】:

    • 非常感谢。但这适用于范围查询,如果我的查询搜索可能是冗余的单个记录怎么办。所以在这种情况下,Big Query 显然会遍历每个月的表来查找该记录。
    • BigQuery 针对聚合查询进行了优化,而不是搜索单个记录的查询。所以,是的,不幸的是,在这种情况下,如果您只查找可能在任何表中的单个记录,则需要搜索每个月的表。
    【解决方案3】:

    这是一个演示多表选择示例的 sn-p:

    SELECT trafficSource.medium AS Traffic_Source, COUNT(trafficSource.medium) AS Counts_Source
    FROM [608XXXXX.ga_sessions_20131008],
    [608XXXXX.ga_sessions_20131009],
    [608XXXXX.ga_sessions_20131010],
    [608XXXXX.ga_sessions_20131011],
    [608XXXXX.ga_sessions_20131012],
    [608XXXXX.ga_sessions_20131013],
    [608XXXXX.ga_sessions_20131014],
    [608XXXXX.ga_sessions_20131015],
    GROUP BY Traffic_Source
    ORDER BY Counts_Source DESC
    

    【讨论】:

      【解决方案4】:

      2017 年更新:

      使用 BigQuery #standardSQL - 您可以使用标准 UNION ALL 来遍历多个表,也可以使用 * 来匹配具有相同前缀的所有表。使用 * 匹配器时,您还可以访问元列 _TABLE_SUFFIX - 了解行来自哪个表。

      SELECT * FROM Roster
      UNION ALL
      SELECT * FROM TeamMascot
      

      【讨论】:

        【解决方案5】:

        标准 SQL。

        使用通配符。

        SELECT trafficSource.medium AS Traffic_Source, COUNT(trafficSource.medium) AS Counts_Source
        FROM `608XXXXX.ga_sessions_201310*`
        GROUP BY Traffic_Source
        ORDER BY Counts_Source DESC
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-18
          相关资源
          最近更新 更多