加入 PowerBI自己学 知识星球:下载源文件,边学边练;遇到问题,还可以提问交流。
一个列的元素与另一个列(也可以是它本身)的元素组合在一起,是PowerQuery中常见的操作。比如笛卡尔积,有一张店铺表和一张产品表,需要把店铺表和产品表交叉相乘,进行笛卡尔积运算,让店铺表中的每一个的店铺都匹配到产品表中的每一个产品,用于模型建立关系的中间表或者其他用途。
举例
有一个成员表,成员列中有4个成员A、B、C、D。组合方式有3种:
1 笛卡尔积,Cartesian product,相同的成员也组合,考虑成员的前后顺序。可能性的种数是数学中的两个集合个数的乘积,本例的可能性为16种。
2 有序排列组合,Permutation,相同的成员不组合,考虑成员的前后顺序。可能性的种数是数学中的P 4 2,本例的可能性为12种。
3 无序排列组合,Combination,相同的成员不组合,不考虑成员的前后顺序。可能性的种数是数学中的C 4 2,本例的可能性为6种。
以上三种方式,在PowerQuery中可以按照笛卡尔积、有序排列组合、无序排列组合逐步实现。
操作步骤
1 笛卡尔积
STEP 1 PowerQuery获取数据后,在左侧的成员表上点击鼠标右键,选择下面的复制,生成一份成员表的副本。
STEP 2 选择新生成的表,点击菜单栏添加列下的自定义列,命名成员2,输入成员表[成员],调取成员表的成员列。
STEP 3 点击成员2列标题右侧的展开按钮,选择扩展到新行。
共16种可能,结果如下:
2 有序排列组合
在笛卡尔积的基础上,添加辅助条件列,判断两列成员是否相等,筛选不相等的部分,最后删除辅助列。
共12种可能,结果如下:
3 无序排列组合
在有序排列组合的基础上,添加辅助自定义列对两列成员按相同顺序组合,选中辅助列删除重复项,最后删除辅助列。
辅助列:
Text.Combine(List.Transform(List.Sort({[成员],[成员2]}),Text.From))
共6种可能,结果如下: