BigQuery:按表名分组

Posted

技术标签:

【中文标题】BigQuery:按表名分组【英文标题】:BigQuery: Group by table name 【发布时间】:2014-02-19 14:40:14 【问题描述】:

我的数据集 (ds1) 如下所示:

2014_01_01_tableA
2014_01_01_tableB

2014_01_02_tableA
2014_01_02_tableB

查询:

SELECT date, COUNT(1) AS counter 
FROM [ds1.2014_01_01_tableA], [ds1.2014_01_01_tableB], [ds1.2014_01_02_tableA], [ds1.2014_01_02_tableB] 
GROUP BY date;

返回:

date, counter
2014-01-01, 100
2014-01-02, 200

是否也可以按表名分组?可能是这样的? ...

SELECT date, COUNT(1) AS counter, TABLE_NAME() AS table_name
FROM [ds1.2014_01_01_tableA], [ds1.2014_01_01_tableB], [ds1.2014_01_02_tableA], [ds1.2014_01_02_tableB] 
GROUP BY table_name, date;

预期结果:

date, counter, table_name
2014-01-01, 50, 2014_01_01_tableA
2014-01-01, 50, 2014_01_01_tableB
2014-01-02, 100, 2014_01_02_tableA
2014-01-02, 100, 2014_01_02_tableB

TABLE_NAME() AS table_name 不存在,很遗憾。

【问题讨论】:

【参考方案1】:

不幸的是,没有办法干净地做到这一点。我添加了一个内部功能请求。

丑陋的做法是:

SELECT date, COUNT(1) AS counter, table_name
FROM 
 (SELECT *, "2014_01_01_tableA" as table_name FROM [ds1.2014_01_01_tableA]), 
 (SELECT *, "2014_01_01_tableB" as table_name FROM [ds1.2014_01_01_tableB]), 
 (SELECT *, "2014_01_02_tableA" as table_name FROM [ds1.2014_01_02_tableA]), 
 (SELECT *, "2014_01_02_tableB" as table_name FROM [ds1.2014_01_02_tableB])
GROUP BY table_name, date;

【讨论】:

现在有“表通配符函数”能够按表名进行分组,感觉比以往任何时候都更需要它。 @jordan-tigani - 这方面有什么进展吗? @jordan-tigani 也对此感到好奇。【参考方案2】:

现在可以使用_TABLE_SUFFIX 参数和表通配符。

SELECT date, COUNT(1) AS counter, _TABLE_SUFFIX as table_name
FROM `ds1.*`
WHERE _TABLE_SUFFIX IN ('2014_01_01_tableA', '2014_01_01_tableB', '2014_01_02_tableA', '2014_01_02_tableB')
GROUP BY table_name, date

_TABLE_SUFFIXFROM 语句中的通配符捕获的任何内容。它可以是部分表后缀或完整的表名。例如,如果您使用FROM ds1.2014_01_*,则对应的_TABLE_SUFFIX 将是01_tableA

【讨论】:

以上是关于BigQuery:按表名分组的主要内容,如果未能解决你的问题,请参考以下文章

sql 按表名进行SQL搜索

按表名查找 Eloquent 类

sql 在MSSQL服务器上按表名查找表

多表操作

按表中的分组记录运行总计

sql 按表分组然后对其进行排序。