地理维度层级设计
地理维把国家、省、市、区等多级行政区划放在同一张表里,每行保留最小粒度(一般是区/县),同时冗余上级的名称与代码。这样单表既能直接按区下钻,也能不经过层层 join 就按市、省、国家汇总。跨境业务再叠加国家代码与行政区划版本管理。
基本信息
| 层级示例 | 国家 - 省 - 市 - 区(县)四级 |
|---|---|
| 表行粒度 | 一行一个最小行政区 |
| 冗余内容 | 上级代码与上级名称直出 |
| 编码规范 | 兼容国标行政区划代码,便于对齐外部数据 |
| 版本管理 | 撤县设区、改名等调整留版本 |
| 跨境扩展 | 叠加国家代码与邮编规则 |
典型使用场景
- 销售地图:同一地理维支持按区、市、省三级下钻看业绩
- 区域负责人报表:按大区归属汇总,大区与行政层级解耦
- 物流时效:按市、区统计派送时长与准点率
- 门店选址:把门店地址落到区级,统计商圈密度与覆盖
- 跨境统计:国家级报表叠加海外仓与目的国区划
- 外部数据对齐:外部源只到市级时,回退到共同层级再比对
层级汇总与下钻
层级汇总与下钻
SELECT g.province_name, g.city_name, g.district_name,
count(1) AS order_cnt, sum(f.amount) AS amt
FROM fact_order f
JOIN dim_geo g ON f.geo_sk = g.geo_sk
WHERE g.country_code = 'CN'
AND g.is_current = 1
GROUP BY g.province_name, g.city_name, g.district_name; -- 同一维表内完成区-市-省汇总
SELECT province_name, count(1) AS city_cnt
FROM dim_geo
WHERE country_code = 'CN' AND current_level = 'city'
GROUP BY province_name; -- 按层取数时用 current_level 控制粒度层级字段与用途
| 层级 | 典型字段 | 常见用途 |
|---|---|---|
| 国家 | country_code / country_name | 跨境汇总、汇率与合规口径 |
| 省/州 | province_code / province_name | 大区业绩、区域负责人 |
| 市 | city_code / city_name | 物流时效、城市排名 |
| 区/县 | district_code / district_name | 门店覆盖、精细化投放 |
地理维编码建议采用国标行政区划代码作为业务键,便于与外部地图、物流、第三方数据对齐;冗余上级名称是为了报表便捷,但归属以代码为准,名称仅作展示。
行政区划会调整(撤县设区、跨省划转、更名),要区分「当前归属」与「当时归属」:历史口径需要版本化,只做当前归属时用类型 1 覆盖并明确不回刷历史。