Google bigquery 有没有办法在bigquery中使用GROUP BY执行通配符?
假设我有两个表:tbl_a包含一个id字段id和一大堆其他字段fa,fb。。。fz。所有ID都是唯一的 tbl_b包含两个字段id和value,其中同一id可以有多个值。我想用tbl_a中相同的字段创建一个表,但用一个额外的字段给出平均值。这可以通过以下方式实现:Google bigquery 有没有办法在bigquery中使用GROUP BY执行通配符?,google-bigquery,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_
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
我的问题是:
有没有一种方法可以在不必显式写入要从旧表传输到新表的每个字段的情况下编写此查询
如果到那时还没有分组,那么可以使用通配符来完成,但我不知道在有分组依据的地方如何进行,因为通配符必须有效地位于ANY_值内。下面是针对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
下面是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