关于TABLE_QUERY函数的几个问题:
table_id
,是否还有其他字段?TABLE_QUERY()
如何运作? 答案 0 :(得分:47)
TABLE_QUERY()
函数允许您编写一个SQL WHERE
子句,该子句被评估以查找运行查询的表。例如,您可以运行以下查询来计算publicdata:samples
数据集中超过7天的所有表中的行数:
SELECT count(*)
FROM TABLE_QUERY(publicdata:samples,
"MSEC_TO_TIMESTAMP(creation_time) < "
+ "DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY')")
或者你可以运行它来查询名称中包含'git'的所有表(github_timeline
和github_nested
样本表)并找到最常见的URL:
SELECT url, COUNT(*)
FROM TABLE_QUERY(publicdata:samples, "table_id CONTAINS 'git'")
GROUP EACH BY url
ORDER BY url DESC
LIMIT 100
尽管功能非常强大,TABLE_QUERY()
可能很难使用。必须将WHERE
子句指定为字符串,这可能有点尴尬。此外,它可能很难调试,因为当出现问题时,您只会收到错误“错误评估辅助查询”,这并不总是有用。
工作原理:
TABLE_QUERY()
基本上执行两个查询。当您运行TABLE_QUERY(<dataset>, <table_query>)
时,BigQuery会执行SELECT table_id FROM <dataset>.__TABLES_SUMMARY__ WHERE <table_query>
以获取运行查询的表ID列表,然后它会对这些表执行您的实际查询。
该查询的__TABLES__
部分可能看起来不熟悉。 __TABLES_SUMMARY__
是一个元表,包含有关数据集中表的信息。您可以自己使用此元表。例如,查询SELECT * FROM publicdata:samples.__TABLES_SUMMARY__
将返回有关publicdata:samples
数据集中表格的元数据。
可用字段:
__TABLES_SUMMARY__
元表的字段(TABLE_QUERY
查询中都可用)包括:
table_id
:表格的名称。creation_time
:表格创建后的时间,自1970年1月1日UTC以来的毫秒数。这与表中的creation_time
字段相同。type
:无论是视图(2)还是常规表(1)。 TABLE_QUERY()
中的以下字段不,因为它们是__TABLES__
的成员,但不是__TABLES_SUMMARY__
的成员。他们留在这里是为了历史,并部分记录__TABLES__
metatable:
last_modified_time
:自1970年1月1日UTC以来的毫秒,表格已更新(元数据或表格内容)。请注意,如果您使用tabledata.insertAll()
将记录流式传输到您的表格,则可能会过时几分钟。row_count
:表格中的行数。size_bytes
:表格的总大小(以字节为单位)。如何调试
为了调试TABLE_QUERY()
查询,您可以执行与BigQuery相同的操作;也就是说,您可以自己运行metatable查询。例如:
SELECT * FROM publicdata:samples.__TABLES_SUMMARY__
WHERE MSEC_TO_TIMESTAMP(creation_time) <
DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY')
不仅可以调试查询,还可以查看运行TABLE_QUERY
函数时返回的表。一旦调试了内部查询,就可以将它与完整查询放在一起进行查询。
答案 1 :(得分:3)
替代答案,对于那些前进到标准SQL的人:
例如,要获得2010年至2014年全球平均NOAA GSOD温度:
public function companies() {
return $this->belongsTo('App\Company')
}