您在此处:
Tableau 语义中的共享维度
通过相同维度表连接多个事实表,分析和比较数据。以干净和可信的方式构建复杂的业务相关分析,避免重复关系并消除语义模型中的循环。
在大多数数据集中,不同的业务域分别跟踪自己的事件:销售跟踪交易,市场营销跟踪市场活动,库存跟踪库存水平等。这些业务流程中的每一个都表示为一个事实表,其中包含与该域相关的核心度量和事务数据。
为了使此数据有意义,每个事实表连接到一个或多个维度表,例如产品、日期、市场活动、客户或供应商。维度描述事实,并允许用户分组、筛选或聚合它们(例如,按日期、产品类别、客户细分)。
通常,不同的事实表共享相同的维度。例如,市场营销和销售都与产品和日期相关。
当事实表与共享维度相关时,您的组织可以一起调整数据和分析值,使您能够:
- 按产品比较市场营销的市场活动成本和销售收入
- 按供应商或客户细分库存水平和销售业绩
- 分析客户支持活动以及购买和退货行为。
此类查询跨越不同的事实表,而共享维度提供了连接点,允许您将这些事实汇总在一起并并一起探索它们。
为了在语义模型中支持这一点,我们引入了共享表的概念。当维度表被标记为共享时,系统知道它可以用来安全地连接多个事实表。这支持干净、无周期的多事实分析,并确保语义模型可以跨域正确解释和执行查询。
相关表与非相关表
共享表中的另一个关键概念是相关表和非相关表之间的差异。
当两个表通过定义的关系直接连接时,它们被认为是相关的。相关表之间的查询按预期工作:系统使用定义的路径将它们连接起来。
如果两个表完全不相关(这意味着它们没有直接或共享的连接),系统无法确定如何组合它们的数据,查询将失败。
在某些情况下,表格仅通过共享维度连接。如果您查询两个事实表中的字段,而没有包含共享表中的字段,并且这些字段没有聚合,系统将执行交叉联接。这意味着一个事实表中的每一行都与另一个事实表中的每一行组合在一起,因为没有共享密钥将它们对齐。
例如,如果销售和市场营销都链接到共享产品表,并且您查询 [Sales].[Sales Quantity] 和 [Marketing].[Spend] 而没有 [Products].[Product Name],系统将简单地将所有销售行与所有市场营销行组合在一起。
为避免这种情况,查询必须包含来自共享表的字段,例如产品或日期,该字段用作连接键,并提供共享轴,用于在两个事实之间分组和聚合值。
共享维度可以分析来自表中的数据,否则这些数据将被隔离 -- -- 但只有当在查询中正确使用时。
事实树及其结构
事实树是一组属于相同业务领域且相互连接的表。它通常包括一个或多个事实表以及维度表。
这种结构不仅仅是一个建模概念,它还是系统在您运行查询时自动生成的东西。事实树是语义层内部组织表格的方式,以便正确评估共享维度。
在以上示例图表中,市场营销是连接到共享表“产品和日期”的事实表。这构成了它的事实树。销售是另一个事实表,它连接到相同的共享维度,形成一个单独的事实树。这种结构允许系统了解每棵树如何独立工作,同时仍然可以通过共享维度进行跨树分析。
事实树必须保持无周期。循环引入模糊性:如果系统可以通过多个路径到达同一个表,它可能不知道要遵循哪个路径,或者如何正确应用筛选器和聚合。因此,不允许创建引入周期的新关系,例如将市场营销直接连接到子类别(这已经可以通过产品实现)。
共享维度如何影响查询
共享维度不仅有助于构建语义模型,而且还可以控制查询在运行时的行为方式,确保结果准确和逻辑一致。
假设您正在分析市场营销支出与销售数量的关系。这两个评测来自不同的事实表:市场营销和销售。它们本身不能有意义地对齐,因为没有可以分组的共享上下文。如果您只是将两个字段拖到查询中,而没有使用共享引用,系统将无法匹配行,并可能返回误导性结果,甚至失败。
但是,一旦您引入两个共享维度,例如产品和日期,情况就会发生变化。有了这些,您可以问:“对于每个产品和每个月,我们在市场营销上花费了多少,销售了多少单位?”
因为销售和市场营销都连接到产品和日期(共享表),所以系统现在可以正确地调整这两个评测(按产品、按月),并返回有意义的汇总结果:
| 产品 | 月 | 市场营销支出 | 销售数量 |
|---|---|---|---|
| 自行车 | 2024 年 1 月 | 5,000 | 12 |
| 自行车 | 2024 年 2 月 | null | 8 |
| 汽车 | 2024 年 1 月 | 10,320 | 22 |
| 汽车 | 2024 年 2 月 | 5,000 | 10 |
筛选行为
应用筛选器时,应避免更改不相关表中的数据。
- 当您对特定于事实的字段应用筛选器时,例如市场营销类型,它只筛选该事实表,而不是任何其他事实或共享维度。
- 当您在共享维度上应用筛选器时,例如产品名称或日期,它会应用到连接到它的所有事实表。
此行为会阻止筛选器删除不相关的记录。例如,如果您在市场营销类型筛选器中选择在线,则只有市场营销支出会更新 — 销售数量不受影响。
事实树必须保持无周期。循环引入模糊性:如果系统可以通过多个路径到达同一个表,它可能不知道要遵循哪个路径,或者如何正确应用筛选器和聚合。因此,不允许创建引入周期的新关系,例如将市场营销直接连接到子类别(这已经可以通过产品实现)。
计算字段和事实树包含
计算字段必须遵守事实树边界。如果您创建行级计算字段,例如:
如果 [Support].[Priority] <= 1 Then "High" ELSE "Low"
-- 该字段有效,只要它保持在同一事实树中(在此情况下支持)。您可以使用它来分析模式或根据维度(例如客户或产品)筛选支持相关活动(如果这些维度是共享的),一切都将如预期的那样进行。
但是,如果您尝试创建跨多个事实表的计算字段,例如:
[库存].[数量] + [销售].[销售数量]
-- 平台将引发错误。它尝试合并来自两个不同事实树的行级数据,系统无法解析该表达式的通用详细信息级别。每个事实树都有自己独立的粒度和筛选上下文。
为实现有效的跨事实计算,您必须独立聚合每个事实,然后在视图级别合并这些聚合:
SUM([Inventory].[Quantity]) + SUM([Sales].[Sales Quantity])
允许此表达式,因为两个评测在组合之前都被聚合,聚合的范围是产品级别或视图中的任何维度。
共享维度和事实树的限制
- 事实表必须保持相互断开。它们不能直接连接。它们之间的任何连接必须只能通过共享维度表进行。
- 行级计算字段(无论是维度还是评测)必须完全包含在单个事实树中。
- 您不能将共享表连接到另一个共享表,然后连接到事实表。换句话说,任何事实表及其维度之间的连接路径中只能存在一个共享表。例如,如果产品是连接到日期的共享表(另一个共享表),然后两者都连接到销售,则不支持此结构。
- 当您从同一查询中的多个事实树中筛选字段时,这些筛选器必须使用 AND 条件而不是 OR 进行组合。
- 创建新共享表
使用共享表通过公共维度链接多个事实表,以比较不同表中的记录。这将保持数据模型干净明确,并确保筛选器在不同数据集之间正确工作。
