18

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

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

4

5 回答 5

39

您还可以使用表通配符函数。这是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上还有其他一些选项。我建议检查一下。

于 2015-02-19T06:10:22.410 回答
15

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

于 2012-11-01T06:15:29.213 回答
5

这是一个演示多表选择示例的片段:

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
于 2013-11-28T18:03:31.187 回答
3

2017年更新:

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

SELECT * FROM Roster
UNION ALL
SELECT * FROM TeamMascot
于 2017-07-07T22:09:44.707 回答
1

标准 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
于 2018-06-28T20:27:30.133 回答