假设我有两个表: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>
答案 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