首页/数据/数仓建模速查/地理维度层级设计
维度与事实设计149 条

地理维度层级设计

国家省市区四级放单表并冗余上级名称,兼顾单表下钻与层级汇总;跨境场景叠加行政区划版本管理。

数仓建模速查数据更新于 2026-10-13

地理维度层级设计

地理维把国家、省、市、区等多级行政区划放在同一张表里,每行保留最小粒度(一般是区/县),同时冗余上级的名称与代码。这样单表既能直接按区下钻,也能不经过层层 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 覆盖并明确不回刷历史。

易错点

  • 只存行政区划代码不存名称,报表处处要联表才能显示地名
  • 区划调整不维护版本,历史订单按新归属统计,历史归属错乱
  • 不同层级混存在同一行却没有层级标记,按省汇总时把省级行也算进去导致重复
  • 省份名称直接当键使用,重名或更名时无法稳定关联,下游被迫人工映射

数据来源与参考

  • Kimball Group:地理维度设计
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌