如何用BigQuery SQL为销售数据新增子类别列并匹配UPC主表?
方案可行性分析
BigQuery完全适配你的需求,相比Connected Sheets有核心优势:
- 处理4年大规模销售数据毫无压力,不会出现Sheets的卡顿、函数超时或数据量限制问题
- SQL的JOIN逻辑比VLOOKUP/FILTER更灵活,能原生解决重复UPC和停产商品匹配缺失的问题,不会像Sheets那样直接返回错误值
- 后续对接数据可视化工具(如Data Studio)更顺畅,无需在Sheets中做繁琐的中间转换
具体SQL写法
假设你的表结构如下:
- 销售数据表:
sales_data,包含字段product_name,sales_volume,main_category,upc - 产品主表:
product_master,包含字段upc,sub_category,可选字段is_discontinued(停产标记)、update_timestamp(数据更新时间)
第一步:清洗主表重复UPC
如果主表存在同一UPC对应多条记录的情况,先通过窗口函数筛选唯一有效记录(比如优先保留非停产、最新更新的条目):
WITH cleaned_product_master AS ( SELECT upc, sub_category, -- 按「非停产优先、最新更新优先」排序,给每个UPC的记录编号 ROW_NUMBER() OVER ( PARTITION BY upc ORDER BY is_discontinued ASC, update_timestamp DESC ) AS row_num FROM `your-project-id.your-dataset-id.product_master` ) -- 只保留每个UPC的第一条有效记录 SELECT upc, sub_category FROM cleaned_product_master WHERE row_num = 1
第二步:关联销售数据与清洗后的主表
用LEFT JOIN确保所有销售数据都被保留,即使UPC匹配不到(比如停产商品或主表无记录),子类别列会显示自定义占位值(如「未匹配」):
WITH cleaned_product_master AS ( SELECT upc, sub_category, ROW_NUMBER() OVER ( PARTITION BY upc ORDER BY is_discontinued ASC, update_timestamp DESC ) AS row_num FROM `your-project-id.your-dataset-id.product_master` ) SELECT s.product_name, s.sales_volume, s.main_category, s.upc, -- 用COALESCE处理匹配缺失的情况,替换为你需要的文本 COALESCE(m.sub_category, '未匹配') AS sub_category FROM `your-project-id.your-dataset-id.sales_data` s LEFT JOIN cleaned_product_master m ON s.upc = m.upc
额外说明
- 如果主表没有
is_discontinued或update_timestamp字段,可以去掉ORDER BY里的对应部分,只按PARTITION BY upc取第一条记录 - 查询结果可直接导出到可视化工具,或创建视图用于后续数据分析
内容的提问来源于stack exchange,提问作者Sean Henry
相关产品推荐
相关产品推荐

