Power Query生成Hold类型全组合表的M查询求助
Power Query M 查询代码实现所有Hold类型组合生成
以下是直接可用的M查询代码,能生成包含所有Hold类型组合(含"No Hold")的两列表:
let // 定义所有Hold类型的基础列表 HoldTypes = {"Credit", "Forecast", "Manual", "Routing"}, // 计算列表长度,用于生成子集索引 ListLength = List.Count(HoldTypes), // 生成从0到2^n-1的数字序列(每个数字对应一个二进制掩码,代表一种组合) MaskNumbers = {0..Number.Power(2, ListLength)-1}, // 对每个掩码数字,生成对应的Hold组合 GenerateCombinations = List.Transform(MaskNumbers, (mask) => let // 将数字转为二进制,补前导零到列表长度位 BinaryStr = Text.PadStart(Number.ToText(mask, "Binary"), ListLength, "0"), // 按二进制位筛选对应的Hold类型 SelectedHolds = List.Select(HoldTypes, (type, index) => Text.Range(BinaryStr, index, 1) = "1"), // 处理空组合为"No Hold",非空组合用逗号拼接 DisplayText = if List.IsEmpty(SelectedHolds) then "No Hold" else Text.Combine(SelectedHolds, ", ") in DisplayText ), // 转换为表并添加ID主键列 ResultTable = Table.FromList(GenerateCombinations, Splitter.SplitByNothing(), {"Values"}), AddID = Table.AddIndexColumn(ResultTable, "ID", 1, 1, Int64.Type) in AddID
代码说明:
- HoldTypes:定义所有需要组合的Hold类型,可根据实际需求修改。
- MaskNumbers:利用二进制掩码原理,
2^n个数字对应n个元素的所有子集(包括空集)。 - GenerateCombinations:通过二进制位判断哪些Hold类型被选中,空组合显示为"No Hold",非空组合用逗号连接。
- AddID:添加从1开始的自增主键ID列。
运行这段代码后,会得到一张包含ID和Values的表,其中Values列涵盖所有16种可能的组合(4种单类型、6种双类型、4种三类型、1种四类型、1种无类型)。
内容的提问来源于stack exchange,提问作者Natziri
相关产品推荐
相关产品推荐

