如何连接不同地理粒度的销售实际表与目标表?
解决方案
核心思路是先构建全量的「日期+社区」维度框架,再分别关联实际销售和目标数据,避免直接Join带来的维度不匹配问题。
步骤拆解
- 生成今年完整的日期序列(从年初到年末),覆盖已发生和未来日期
- 提取所有存在销售记录的社区维度(State+City+Neighborhood)并去重
- 将日期序列与社区维度做交叉关联,得到所有需要的行框架
- 左关联实际销售表(Table A)填充实际销售额,未来日期自然返回Null
- 左关联目标表(Table B)填充目标销售额,基于State+City匹配,每个社区复用对应城市的目标
SQL示例(通用SQL语法)
-- 1. 生成今年的全量日期范围 WITH date_range AS ( SELECT DATE_TRUNC(CURRENT_DATE(), YEAR) + INTERVAL n DAY AS date FROM GENERATE_SERIES(0, EXTRACT(DOY FROM DATE_TRUNC(CURRENT_DATE(), YEAR) + INTERVAL '1 YEAR' - INTERVAL '1 DAY') - 1) AS n ), -- 2. 提取所有社区维度数据(去重) neighborhood_dim AS ( SELECT DISTINCT state, city, neighborhood, 'Neighborhood' AS geo_agg -- 固定地理聚合值为社区级 FROM Table_A ), -- 3. 构建全量日期+社区的基础框架 base_frame AS ( SELECT dr.date, nd.geo_agg, nd.state, nd.city, nd.neighborhood FROM date_range dr CROSS JOIN neighborhood_dim nd ) -- 4. 关联实际销售和目标数据 SELECT bf.date, bf.geo_agg, bf.state, bf.city, bf.neighborhood, ta.total_sales, tb.target_sales FROM base_frame bf LEFT JOIN Table_A ta ON bf.date = ta.date AND bf.state = ta.state AND bf.city = ta.city AND bf.neighborhood = ta.neighborhood LEFT JOIN Table_B tb ON bf.state = tb.state AND bf.city = tb.city ORDER BY bf.date, bf.neighborhood;
期望输出(洛杉矶示例)
| Date | geo_agg | State | city | neighborhood | total_sales | target_sales |
|---|---|---|---|---|---|---|
| 11/5/2023 | Neighborhood | California | Los Angeles | Santa Barbara | $50 | $150 |
| 11/5/2023 | Neighborhood | California | Los Angeles | Hollywood | $502 | $150 |
| 11/6/2023 | Neighborhood | California | Los Angeles | Santa Barbara | $502 | $150 |
| 11/6/2023 | Neighborhood | California | Los Angeles | Hollywood | $502 | $150 |
| 11/7/2023 (今日) | Neighborhood | California | Los Angeles | Santa Barbara | $502 | $150 |
| 11/7/2023 (今日) | Neighborhood | California | Los Angeles | Hollywood | $502 | $150 |
| 11/8/2023 (未来) | Neighborhood | California | Los Angeles | Santa Barbara | Null | $150 |
| 11/8/2023 (未来) | Neighborhood | California | Los Angeles | Hollywood | Null | $150 |
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

