Power Pivot 购物篮分析分组 GENERATE 之笛卡尔积、排列、组合

传送门https://zhuanlan.zhihu.com/p/47561066

原贴如下,14楼
https://pbihub.cn/qa/204#reply456

1、背景

昨天在看论坛帖子时候,看到一个关于SKU组合的问题,有很多M大佬都给出了处理方案,于是想用dax也写一个。
注:
原贴有dax的写法,这里主要说明下GENERATE之笛卡尔积、排列、组合处理过程。
上效果图
file
左起依次表名:data、笛卡尔积、排列、组合

2、问题

1、大前提是使我们要使用data的数据做购物篮分析分组;
2、在问题1已的基础上,笛卡尔积表(5*5)存在类似黄色区域问题,SKU两两相同,这是不需要看到的;
3、在问题1的基础上,排列表(见图中公式)存在类似绿色区域的问题,SKU1对SKU2和SKU2对SKU1其实是一样的,这也是我们不需要看到的;
4、基于以上,我们通过笛卡尔积-排列-组合这样 处理下来得到我们要的购物篮分组。

3、上DAX

1、笛卡尔积
file

DEFINE
    VAR T1 =
        SELECTCOLUMNS ( data, "SKUA", data[SKU] )
    VAR T2 =
        SELECTCOLUMNS ( data, "SKUB", data[SKU] )
    VAR T3 =
        GENERATE ( T1, T2 )
EVALUATE
T3
ORDER BY
    [SKUA],
    [SKUB] ASC

2、排列
file

DEFINE
    VAR T1 =
        SELECTCOLUMNS ( data, "SKUA", data[SKU] )
    VAR T2 =
        SELECTCOLUMNS ( data, "SKUB", data[SKU] )
    VAR T3 =
        GENERATE ( T1, T2 )
    VAR T4 =
        FILTER ( T3, [SKUA] <> [SKUB] )

EVALUATE
T4
ORDER BY
    [SKUA],
    [SKUB] ASC

3、组合
file

DEFINE
    VAR T1 =
        SELECTCOLUMNS ( data, "SKUA", data[SKU] )
    VAR T2 =
        SELECTCOLUMNS ( data, "SKUB", data[SKU] )
    VAR T3 =
        GENERATE ( T1, T2 )
    VAR T4 =
        FILTER ( T3, [SKUA] <> [SKUB] )
    VAR T5 =
        DISTINCT (
            SELECTCOLUMNS (
                ADDCOLUMNS (
                    T4,
                    "AB", IF ( [SKUA] < [SKUB], [SKUA] & [SKUB], [SKUB] & [SKUA] )
                ),
                "AB", [AB]
            )
        )
    VAR T6 =
        FILTER ( ADDCOLUMNS ( T4, "AB", [SKUA] & [SKUB] ), [AB] IN T5 )
    VAR T7 =
        SUMMARIZE ( T6, [SKUA], [SKUB] )
EVALUATE
T7
ORDER BY
    [SKUA],
    [SKUB] ASC

4、总结

1、以上问题基于购物篮分析产生,所以需要组合结果;
2、在实际需求中肯定这三种都是有需求的;
3、处理GENERATE,两列名称不能相同,于是有了上述的GENERATE ( T1, T2 ),而不是GENERATE ( T1, T1);
4、处理从排列到组合的思路主要是利用两两组合排序后去重即可,分步体会从T1-T7的过程。

by 焦棚子