Power BI/Power Query无唯一ID事实表CSV标签转维度及代理键生成问询
解答
哈希生成唯一键的可行性
完全可以用日期、名称、金额三个字段通过哈希生成关联用的代理键,这是无主键事实表处理多值属性的常用方案。
只要你的业务场景中,同一日期、相同名称、相同金额的记录不需要做单独区分,这个方案就没有问题。如果存在三个字段完全重复但业务上属于不同记录的情况,只要在拼接字段时额外加入Power Query生成的行索引即可保证唯一性。
Power Query生成哈希键的实现
添加自定义列,拼接三个字段时加入分隔符避免字段内容拼接歧义,示例代码如下:
// 新版本Power Query(2023+)直接用Text.ToHash = Text.ToHash(Text.From([Date]) & "|" & [Name] & "|" & Text.From([amount]), "SHA256") // 旧版本兼容写法 = Binary.ToText( Crypto.Hash( Symbol.ToBinary(Text.From([Date]) & "|" & [Name] & "|" & Text.From([amount])), HashAlgorithm.SHA256 ), BinaryEncoding.Base64 )
如果需要处理重复业务字段的场景,先添加索引列,再把索引列也加入拼接逻辑:
= Text.ToHash(Text.From([Date]) & "|" & [Name] & "|" & Text.From([amount]) & "|" & Text.From([Index]), "SHA256")
星型Schema完整搭建步骤
- 给原始事实表新增上述哈希代理键,命名为
Fact_SK,保留原表所有字段 - 新建桥接表:复制原始事实表,仅保留
Fact_SK和tags两列,对tags列按逗号拆分到行,得到「单条记录-单个标签」的一一对应结构 - 新建标签维度表:提取桥接表中
tags列的所有唯一值,给每个标签分配唯一的Tag_SK,维度表仅保留Tag_SK和标签名称两个字段 - 建立表间关系:标签维度表
Tag_SK一对多关联 桥接表Tag_SK;桥接表Fact_SK多对一关联 原始事实表Fact_SK
筛选效果验证
搭建完成后完全匹配你的需求:
- 单选
everyday标签时,会自动匹配桥接表中所有对应Fact_SK,返回事实表中3条关联记录 - 同时选中
health和everyday时,默认取两个标签对应Fact_SK的交集,返回符合要求的2条记录
内容的提问来源于stack exchange,提问作者user1048175
相关产品推荐
相关产品推荐

