<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>数据建模 on My Learning Notes</title><link>https://eleanora-lyh.github.io/MyLearningNotes/tags/%E6%95%B0%E6%8D%AE%E5%BB%BA%E6%A8%A1/</link><description>Recent content in 数据建模 on My Learning Notes</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 02 Sep 2026 10:27:13 +0000</lastBuildDate><atom:link href="https://eleanora-lyh.github.io/MyLearningNotes/tags/%E6%95%B0%E6%8D%AE%E5%BB%BA%E6%A8%A1/index.xml" rel="self" type="application/rss+xml"/><item><title>【工作杂谈_20260817】多维分析与数据建模: 维度上卷——从明细粒度到汇总层级</title><link>https://eleanora-lyh.github.io/MyLearningNotes/posts/work/multidimensionalanalysis/20260817_%E5%A4%9A%E7%BB%B4%E5%88%86%E6%9E%90%E4%B8%8E%E6%95%B0%E6%8D%AE%E5%BB%BA%E6%A8%A1_%E7%BB%B4%E5%BA%A6%E4%B8%8A%E5%8D%B7/</link><pubDate>Mon, 17 Aug 2026 20:51:34 +0800</pubDate><guid>https://eleanora-lyh.github.io/MyLearningNotes/posts/work/multidimensionalanalysis/20260817_%E5%A4%9A%E7%BB%B4%E5%88%86%E6%9E%90%E4%B8%8E%E6%95%B0%E6%8D%AE%E5%BB%BA%E6%A8%A1_%E7%BB%B4%E5%BA%A6%E4%B8%8A%E5%8D%B7/</guid><description>&lt;h1 id="1-什么是维度上卷"&gt;1. 什么是“维度上卷”
&lt;/h1&gt;&lt;p&gt;维度上卷 Roll-up 本质上是维度建模和 OLAP 中的分析概念；ETL 中的维度上卷，是通过数据转换和聚合，将细粒度事实数据加工为更高层级、更粗粒度的汇总数据。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Roll-up 是分析语义&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ETL 是实现手段&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;聚合表、汇总事实表是落地结果&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所谓上卷，就是从&lt;strong&gt;更细维度层级聚合成更高维度层&lt;/strong&gt;，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;时间维度：日 → 月 → 季度 → 年&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;地域维度：城市 → 省份 → 国家&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;产品维度：SKU → SubCategory → Category&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如原始数据是：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Date&lt;/th&gt;
 &lt;th&gt;City&lt;/th&gt;
 &lt;th&gt;Province&lt;/th&gt;
 &lt;th&gt;Country&lt;/th&gt;
 &lt;th&gt;Product&lt;/th&gt;
 &lt;th&gt;Revenue&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-08-01&lt;/td&gt;
 &lt;td&gt;City1&lt;/td&gt;
 &lt;td&gt;Province1&lt;/td&gt;
 &lt;td&gt;Country1&lt;/td&gt;
 &lt;td&gt;A&lt;/td&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-08-02&lt;/td&gt;
 &lt;td&gt;City3&lt;/td&gt;
 &lt;td&gt;Province2&lt;/td&gt;
 &lt;td&gt;Country1&lt;/td&gt;
 &lt;td&gt;A&lt;/td&gt;
 &lt;td&gt;150&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-08-01&lt;/td&gt;
 &lt;td&gt;City2&lt;/td&gt;
 &lt;td&gt;Province1&lt;/td&gt;
 &lt;td&gt;Country1&lt;/td&gt;
 &lt;td&gt;A&lt;/td&gt;
 &lt;td&gt;80&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;经过时间和地域上卷（C1/C2都属于P1）：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Month&lt;/th&gt;
 &lt;th&gt;Province&lt;/th&gt;
 &lt;th&gt;Product&lt;/th&gt;
 &lt;th&gt;Revenue&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-08&lt;/td&gt;
 &lt;td&gt;Province1&lt;/td&gt;
 &lt;td&gt;A&lt;/td&gt;
 &lt;td&gt;180&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-08&lt;/td&gt;
 &lt;td&gt;Province12&lt;/td&gt;
 &lt;td&gt;A&lt;/td&gt;
 &lt;td&gt;150&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这里发生了两个变化：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Date → Month&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;City → Province&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;同时：&lt;code&gt;Revenue = SUM(100 + 150 + 80) = 330&lt;/code&gt;&lt;/p&gt;
&lt;h1 id="2-etl-中上卷的核心是改变事实粒度"&gt;2. ETL 中上卷的核心是“改变事实粒度”
&lt;/h1&gt;&lt;p&gt;上卷不能只理解为 &lt;code&gt;GROUP BY&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;它真正改变的是：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;事实表中一行数据所代表的业务范围。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;状态&lt;/th&gt;
 &lt;th&gt;一行含义&lt;/th&gt;
 &lt;th&gt;粒度&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;上卷前&lt;/td&gt;
 &lt;td&gt;某一天 + 某城市 + 某SKU 的销售情况&lt;/td&gt;
 &lt;td&gt;Date + City + SKU&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;上卷后&lt;/td&gt;
 &lt;td&gt;某个月 + 某省份 + 某产品类别的销售情况&lt;/td&gt;
 &lt;td&gt;Month + Province + Category&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;事实表中的维度键决定事实数据的粒度。&lt;strong&gt;事实可以存储在更高粒度，但高粒度事实通常无法再准确拆分回更细粒度&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;即 日级 → 月级 通常是可完成的；&lt;/p&gt;
&lt;p&gt;但 月级 → 日级 如果没有保留日级明细，无法准确恢复。&lt;/p&gt;
&lt;h1 id="3-etl-中上卷的完整流程"&gt;3. ETL 中上卷的完整流程
&lt;/h1&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD
 A["原始数据"] --&gt; B["Step1: 数据质量检查"]

 B --&gt; B1["检查 City → Province 是否唯一"]
 B --&gt; B2["检查 Province → Country 是否唯一"]
 B --&gt; B3["识别缺失、错误和历史变更"]

 B1 --&gt; C["Step2: 加载维表"]
 B2 --&gt; C
 B3 --&gt; C

 C --&gt; C1["DimDate"]
 C --&gt; C2["DimGeography"]
 C --&gt; C3["DimProduct"]

 C1 --&gt; D["Step3: 生成明细事实表"]
 C2 --&gt; D
 C3 --&gt; D

 D --&gt; D1["FactRevenueDaily"]
 D1 --&gt; E["Step4: 预聚合上卷"]

 E --&gt; E1["FactRevenueMonthlyCity"]
 E --&gt; E2["FactRevenueMonthlyProvince"]
 E --&gt; E3["FactRevenueMonthlyCountry"]

 E1 --&gt; F["Step5: 一致性校验"]
 E2 --&gt; F
 E3 --&gt; F

 F --&gt; F1["各级 Revenue 总和均应为 330"]

 classDef step fill:#FFE08A,stroke:#A86700,color:#3D2900,stroke-width:2px
 class B,C,D,E,F step&lt;/pre&gt;&lt;h2 id="31-数据质量检查"&gt;3.1 数据质量检查
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;检查 City → Province&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;City&lt;/th&gt;
 &lt;th&gt;Province&lt;/th&gt;
 &lt;th&gt;是否唯一&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;City1&lt;/td&gt;
 &lt;td&gt;Province1&lt;/td&gt;
 &lt;td&gt;是&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;City2&lt;/td&gt;
 &lt;td&gt;Province1&lt;/td&gt;
 &lt;td&gt;是&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;City3&lt;/td&gt;
 &lt;td&gt;Province2&lt;/td&gt;
 &lt;td&gt;是&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;当前数据中，每个 City 只属于一个 Province，因此层级关系正常。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;检查 Province → Country&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Province&lt;/th&gt;
 &lt;th&gt;Country&lt;/th&gt;
 &lt;th&gt;是否唯一&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Province1&lt;/td&gt;
 &lt;td&gt;Country1&lt;/td&gt;
 &lt;td&gt;是&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Province2&lt;/td&gt;
 &lt;td&gt;Country1&lt;/td&gt;
 &lt;td&gt;是&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最终可以建立稳定的地理层级：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD
 A1["City1"] --&gt; B1["Province1"]
 A2["City2"] --&gt; B1["Province1"]
 A3["City3"] --&gt; B2["Province2"]

 B1["Province1"] --&gt; C2["Country1"]
 B2["Province2"] --&gt; C2["Country1"]&lt;/pre&gt;&lt;h2 id="32-加载维表"&gt;3.2 加载维表
&lt;/h2&gt;&lt;p&gt;不建议在事实表里重复保存 City、Province、Country 名称。所以按照星型模型可以&lt;strong&gt;拆分事实数据与维度数据&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;地域维表 &lt;code&gt;DimGeography&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;日期维表 &lt;code&gt;DimDate&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;产品表 &lt;code&gt;DimProduct&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="地域维表-dimgeography"&gt;地域维表 DimGeography
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;GeographyKey&lt;/th&gt;
 &lt;th&gt;City&lt;/th&gt;
 &lt;th&gt;Province&lt;/th&gt;
 &lt;th&gt;Country&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;101&lt;/td&gt;
 &lt;td&gt;City1&lt;/td&gt;
 &lt;td&gt;Province1&lt;/td&gt;
 &lt;td&gt;Country1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;102&lt;/td&gt;
 &lt;td&gt;City3&lt;/td&gt;
 &lt;td&gt;Province2&lt;/td&gt;
 &lt;td&gt;Country2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;103&lt;/td&gt;
 &lt;td&gt;City2&lt;/td&gt;
 &lt;td&gt;Province1&lt;/td&gt;
 &lt;td&gt;Country1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="日期维表-dimdate"&gt;日期维表 DimDate
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;DateKey&lt;/th&gt;
 &lt;th&gt;Date&lt;/th&gt;
 &lt;th&gt;Month&lt;/th&gt;
 &lt;th&gt;Quarter&lt;/th&gt;
 &lt;th&gt;Year&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;20260801&lt;/td&gt;
 &lt;td&gt;2026-08-01&lt;/td&gt;
 &lt;td&gt;2026-08&lt;/td&gt;
 &lt;td&gt;2026-Q3&lt;/td&gt;
 &lt;td&gt;2026&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;20260802&lt;/td&gt;
 &lt;td&gt;2026-08-02&lt;/td&gt;
 &lt;td&gt;2026-08&lt;/td&gt;
 &lt;td&gt;2026-Q3&lt;/td&gt;
 &lt;td&gt;2026&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="产品表-dimproduct"&gt;产品表 DimProduct
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;ProductKey&lt;/th&gt;
 &lt;th&gt;Product&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;201&lt;/td&gt;
 &lt;td&gt;A&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果存在产品类别，还可以设计为：Product → ProductCategory → ProductLine&lt;/p&gt;
&lt;h2 id="33-生成明细事实表"&gt;3.3 生成明细事实表
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;明细事实表&lt;code&gt;FactRevenueDaily&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;DateKey&lt;/th&gt;
 &lt;th&gt;GeographyKey&lt;/th&gt;
 &lt;th&gt;ProductKey&lt;/th&gt;
 &lt;th&gt;Revenue&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;20260801&lt;/td&gt;
 &lt;td&gt;101&lt;/td&gt;
 &lt;td&gt;201&lt;/td&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;20260802&lt;/td&gt;
 &lt;td&gt;103&lt;/td&gt;
 &lt;td&gt;201&lt;/td&gt;
 &lt;td&gt;150&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;20260801&lt;/td&gt;
 &lt;td&gt;102&lt;/td&gt;
 &lt;td&gt;201&lt;/td&gt;
 &lt;td&gt;80&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;粒度仍然是：&lt;code&gt;Date + GeographyKey + Product&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;City、Province、Country 名称不需要重复保存在事实表中，而是通过 &lt;code&gt;GeographyKey&lt;/code&gt; 关联 &lt;code&gt;DimGeography&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="34-预聚合上卷"&gt;3.4 预聚合上卷
&lt;/h2&gt;&lt;h3 id="上卷一date--month"&gt;上卷一：Date → Month
&lt;/h3&gt;&lt;p&gt;目标粒度：Month + City + Product，生成 &lt;code&gt;FactRevenueMonthlyCity&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Month&lt;/th&gt;
 &lt;th&gt;City&lt;/th&gt;
 &lt;th&gt;Product&lt;/th&gt;
 &lt;th&gt;Revenue&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-08&lt;/td&gt;
 &lt;td&gt;City1&lt;/td&gt;
 &lt;td&gt;A&lt;/td&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-08&lt;/td&gt;
 &lt;td&gt;City2&lt;/td&gt;
 &lt;td&gt;A&lt;/td&gt;
 &lt;td&gt;80&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-08&lt;/td&gt;
 &lt;td&gt;City3&lt;/td&gt;
 &lt;td&gt;A&lt;/td&gt;
 &lt;td&gt;150&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这里只提升了时间层级：Date → Month&lt;/p&gt;
&lt;p&gt;City 维度仍保留在原层级&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="上卷二city--province"&gt;上卷二：City → Province
&lt;/h3&gt;&lt;p&gt;目标粒度：Month + Province + Product，生成 &lt;code&gt;FactRevenueMonthlyProvince&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Month&lt;/th&gt;
 &lt;th&gt;Province&lt;/th&gt;
 &lt;th&gt;Product&lt;/th&gt;
 &lt;th&gt;Revenue&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-08&lt;/td&gt;
 &lt;td&gt;Province1&lt;/td&gt;
 &lt;td&gt;A&lt;/td&gt;
 &lt;td&gt;180&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-08&lt;/td&gt;
 &lt;td&gt;Province2&lt;/td&gt;
 &lt;td&gt;A&lt;/td&gt;
 &lt;td&gt;150&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;计算过程：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Province1 = City1 100 + City2 80 = 180
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Province2 = City3 150
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里同时发生：&lt;/p&gt;
&lt;p&gt;Date → Month&lt;/p&gt;
&lt;p&gt;City → Province&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="上卷三province--country"&gt;上卷三：Province → Country
&lt;/h3&gt;&lt;p&gt;目标粒度：Month + Country + Product，生成 &lt;code&gt;FactRevenueMonthlyCountry&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Month&lt;/th&gt;
 &lt;th&gt;Country&lt;/th&gt;
 &lt;th&gt;Product&lt;/th&gt;
 &lt;th&gt;Revenue&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-08&lt;/td&gt;
 &lt;td&gt;Country1&lt;/td&gt;
 &lt;td&gt;A&lt;/td&gt;
 &lt;td&gt;330&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;计算过程：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Plain" data-lang="Plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Country1 = Province1 180 + Province2 150 = 330
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;完整上卷路径为：&lt;/p&gt;
&lt;p&gt;Date → Month&lt;/p&gt;
&lt;p&gt;City → Province → Country&lt;/p&gt;
&lt;h2 id="35-一致性校验"&gt;3.5 一致性校验
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;层级&lt;/th&gt;
 &lt;th&gt;Revenue 总和&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;原始明细数据&lt;/td&gt;
 &lt;td&gt;330&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Monthly City&lt;/td&gt;
 &lt;td&gt;330&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Monthly Province&lt;/td&gt;
 &lt;td&gt;330&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Monthly Country&lt;/td&gt;
 &lt;td&gt;330&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;因此满足：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;明细层 Revenue
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;= 城市层 Revenue
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;= 省份层 Revenue
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;= 国家层 Revenue
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;= 330
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;最终的数据流可以概括为：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD
 A["明细事实:Date + City + Product"] --&gt; B["月度城市汇总:Month + City + Product"]

 B["月度城市汇总:Month + City + Product"] --&gt; C["月度省份汇总:Month + Province + Product"]

 C["月度省份汇总:Month + Province + Product"] --&gt; D["月度国家汇总:Month + Country + Product"]&lt;/pre&gt;&lt;p&gt;这就是 ETL 中维度上卷的核心：&lt;strong&gt;维度层级向上提升，事实粒度变粗，同时按照目标粒度重新聚合度量值。&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>