BigQuery:按表名分组

mat*_*tes 9 google-bigquery

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

2014_01_01_tableA
2014_01_01_tableB

2014_01_02_tableA
2014_01_02_tableB
Run Code Online (Sandbox Code Playgroud)

查询:

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;
Run Code Online (Sandbox Code Playgroud)

返回:

date, counter
2014-01-01, 100
2014-01-02, 200
Run Code Online (Sandbox Code Playgroud)

是否有可能按表名分组?这样的事可能吗?...

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;
Run Code Online (Sandbox Code Playgroud)

预期结果:

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
Run Code Online (Sandbox Code Playgroud)

TABLE_NAME() AS table_name 不幸的是,不存在.

Jor*_*ani 8

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

这种丑陋的方式是:

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;
Run Code Online (Sandbox Code Playgroud)

  • 现在有了"表通配符函数"能够按表名分组,感觉比以往更需要它. (2认同)

Tim*_*tin 5

现在可以使用_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
Run Code Online (Sandbox Code Playgroud)

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