有没有办法在bigquery中使用GROUP BY做通配符?

时间:2019-02-03 22:12:13

标签: google-bigquery

假设我有两个表:tbl_a包含一个id字段“ id”和一堆其他字段“ fa”,“ fb”,...“ fz”。 (所有ID都是唯一的)

tbl_b包含两个字段“ id”和“ value”-其中同一id可能有多个值。我想制作一个表,其中的字段与tbl_a中的字段相同,但要附加一个字段,以提供平均值“值”。可以这样做:

SELECT
tbl_a.id AS id
ANY_VALUE(tbl_a.fa) AS fa
...
ANY_VALUE(tbl_a.fz) AS fz
AVG(tbl_b.value) AS avg_value
FROM
tbl_a JOIN tbl_b ON tbl_a.id AS tbl_b.id
GROUP BY tbl_a.id

我的问题是:

  

有没有一种方法可以编写此查询,而不必显式地写入要从旧表转移到新表的每个字段中?

如果没有GROUP BY,则可以使用通配符完成此操作,但是我看不到如何在存在GROUP BY的地方进行操作,因为通配符实际上必须位于ANY_VALUE()之内。 / p>

1 个答案:

答案 0 :(得分:4)

以下是用于BigQuery标准SQL

#standardSQL
SELECT ANY_VALUE(a).*, AVG(value) avg_value
FROM `project.dataset.table_a` a
LEFT JOIN `project.dataset.table_b` b
USING(id)
GROUP BY a.id

您可以使用下面的示例中的虚拟数据来测试,玩游戏

#standardSQL
WITH `project.dataset.table_a` AS (
  SELECT 1 id, 11 fa, 12 fb, 13 fc UNION ALL
  SELECT 2, 21, 22, 23 UNION ALL
  SELECT 3, 31, 32, 33
), `project.dataset.table_b` AS (
  SELECT 1 id, 1 value UNION ALL
  SELECT 1, 2 UNION ALL
  SELECT 1, 3 UNION ALL
  SELECT 2, 4 UNION ALL
  SELECT 2, 5 UNION ALL
  SELECT 2, 6 UNION ALL
  SELECT 3, 7 
)
SELECT ANY_VALUE(a).*, AVG(value) avg_value
FROM `project.dataset.table_a` a
LEFT JOIN `project.dataset.table_b` b
USING(id)
GROUP BY a.id
-- ORDER BY a.id

有结果

Row id  fa  fb  fc  avg_value    
1   1   11  12  13  2.0  
2   2   21  22  23  5.0  
3   3   31  32  33  7.0