维度中需聚合的数值型属性建模方案咨询(Project维度AgreedReturn)
维度属性需聚合的建模方案
首先明确:AgreedReturn作为Project维度的固定属性,本身的归属没问题,要不要移到事实表取决于你的聚合场景和使用频率,不是必须移动。以下是具体的处理方案:
如果只是按Project维度分组聚合AgreedReturn
这种场景下,每个Project对应唯一的AgreedReturn值,SUM的结果和取MAX/MIN/LAST_VALUE完全一致,直接在查询中对维度表的AgreedReturn做SUM即可,不需要调整模型。如果需要跨Project维度(比如按部门、时间)聚合AgreedReturn,且要和事实表的其他度量(如实际收入、成本)联动
这时候直接关联维度表会导致AgreedReturn被重复计算(比如一个Project对应100条事务事实记录,SUM时会把该值算100次),可以用两种方式处理:- 查询层面做去重计算
用窗口函数确保每个Project的AgreedReturn只被计算一次,示例SQL:
或者先预聚合维度数据再关联事实表,避免重复:SELECT d.Department, SUM(CASE WHEN ROW_NUMBER() OVER (PARTITION BY d.ProjectID ORDER BY d.ProjectID) = 1 THEN d.AgreedReturn ELSE 0 END) AS TotalAgreedReturn, SUM(f.ActualRevenue) AS TotalActualRevenue FROM ProjectDimension d LEFT JOIN FactTable f ON d.ProjectID = f.ProjectID GROUP BY d.DepartmentSELECT dept.Department, dept.TotalAgreedReturn, SUM(f.ActualRevenue) AS TotalActualRevenue FROM ( SELECT Department, SUM(AgreedReturn) AS TotalAgreedReturn FROM ProjectDimension GROUP BY Department ) dept LEFT JOIN FactTable f ON dept.Department = f.Department GROUP BY dept.Department, dept.TotalAgreedReturn - 模型层面调整(创建对应事实表)
如果用户频繁需要这类跨维度聚合,更规范的做法是创建Project级快照事实表:每条记录对应一个Project,存储AgreedReturn等Project级固定/半固定度量。这样聚合时直接基于该事实表计算,不会出现重复问题,也能和其他事务事实表通过ProjectID关联做联合分析。
- 查询层面做去重计算
总结:优先根据使用场景选择查询层面的解决方案,当聚合需求成为高频操作时,再考虑调整模型创建对应的事实表,无需一开始就把维度属性移到事务型事实表中。
内容的提问来源于stack exchange,提问作者Chicago1988
相关产品推荐
相关产品推荐

