BigQuery如何合并同列名多张月度表为指定字段新表
问题原因说明
你当前使用JOIN的思路完全不符合需求:
- JOIN是横向关联逻辑,用于按匹配键把不同表的列拼接到同一行,适合把同一实体的不同维度属性拼合的场景
- 你需要的是把12张同结构表的行纵向堆叠合并,根本不需要用ride_id做关联,使用
UNION ALL即可实现需求
之前JOIN操作出现异常的原因:
- LEFT JOIN仅返回1月数据:你的SELECT语句只取了jan表的字段,LEFT JOIN以左表为基准匹配,右表(2月表)的独立行不会被返回
- FULL OUTER JOIN出现大量Null:不同月份的ride_id是各自月内生成的订单ID,跨月几乎没有重复匹配值,关联后匹配失败的字段自然全部为Null,完全不是你要的合并效果
两表合并正确写法
先测试前两张表合并可以直接用以下代码,返回结果就是1月+2月所有行的指定5个字段:
SELECT ride_id, member_casual, ride_length, day_of_week, rideable_type FROM `jan_22` UNION ALL SELECT ride_id, member_casual, ride_length, day_of_week, rideable_type FROM `feb_22`
注意:优先用
UNION ALL而非UNION,后者会对全量结果做去重计算,数据量大时会消耗额外资源,ride_id作为唯一订单ID不存在跨月重复的话,不需要做去重操作。
测试通过后要合并12张表,只需要按照相同格式,把3-12月的SELECT语句依次用UNION ALL拼接在后面即可,每个SELECT块保持选取的字段顺序、字段名完全一致。
如果你的12张表在BigQuery同一数据集下、命名规则统一,还可以直接用通配符表简化写法,不用手写12段UNION ALL:
SELECT ride_id, member_casual, ride_length, day_of_week, rideable_type FROM `你的数据集ID.*_22` WHERE _TABLE_SUFFIX IN ('jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec')
新表存储语法说明
BigQuery不支持标准SQL的SELECT INTO语法,根据你的场景选对应写法即可:
- 一次性创建新表并写入全量合并数据:用
CREATE TABLE AS(CTAS)语法
CREATE TABLE `你的目标表名` AS -- 此处替换为上面写好的UNION ALL/通配符表查询逻辑 SELECT ride_id, member_casual, ride_length, day_of_week, rideable_type FROM `jan_22` UNION ALL -- 其余月份查询块
- 如果已经提前创建好了字段类型匹配的空目标表:用
INSERT INTO语法写入数据
INSERT INTO `你提前创建好的目标表名` (ride_id, member_casual, ride_length, day_of_week, rideable_type) -- 此处替换为合并查询逻辑 SELECT ride_id, member_casual, ride_length, day_of_week, rideable_type FROM `jan_22` UNION ALL -- 其余月份查询块
内容的提问来源于stack exchange,提问作者bNHa
相关产品推荐
相关产品推荐

