You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 01:31:17