问题描述
这是一类统计特征值连续出现次数的问题,例如员工连续出勤天数、彩票号码连续出现次数,Excel 解决此问题要用到数组函数,性能较低,不适合大数据量的场景。
样例数据
以彩票数据为例,统计表格中特码单双列 单双号连续出现次数。
最终效果,实现右侧红框中的连续出现次数统计。
DAX 求解思路
解决此问题,除了特征值列,还需要一列索引,本例中将[期数]转为数字列使用。原数据直接导入模型,新建计算列,每行计算上下临界点对应的期数,相减,得到连续出现次数。
CALCULATE ( MAX ( '表'[期数] ), ALL ( '表' ), '表'[特码单双] <> EARLIER ( '表'[特码单双] ), '表'[期数] < EARLIER ( '表'[期数] ) )
IF ( ISBLANK ( CALCULATE ( MIN ( '表'[期数] ), ALL ( '表' ), '表'[特码单双] <> EARLIER ( '表'[特码单双] ), '表'[期数] > EARLIER ( '表'[期数] ) ) ), MAX ( '表'[期数] ) + 1, CALCULATE ( MIN ( '表'[期数] ), ALL ( '表' ), '表'[特码单双] <> EARLIER ( '表'[特码单双] ), '表'[期数] > EARLIER ( '表'[期数] ) ) )
注:IF 语句用来处理首次出现号码上界为空的问题
表[连续次数]=表[连续区间上界]-表[连续区间下界]-1
M 求解思路
使用分组功能对行做计数统计,之后调整 Table.Group 函数的第三个参数,一步可出结果,异常简洁。
Table.Group 第三个参数分为局部(GroupKind.Local)和全局(GroupKind.Global)两种,默认使用全局分组,两者区别是:全局分组将输入表具备相同键值的所有行视为单一值。局部分组将具备相同键值的连续行作为一个单独分组。所以,当单一键值多次出现时,在全局分组下视为一个单值,而局部分组下则视为多值。
高飞老师,powerquery里的第三参数再这个例子中这有奇效,但是和dax相比,效果是不一样的,dax是在原始表格上添加列,但是powerquery里是分组后的结果,虽然是局部分组,但行数有删减。有没有等效的做法?