从数据到信息
从信息到洞察

求解连续次数问题的两种方式

问题描述

这是一类统计特征值连续出现次数的问题,例如员工连续出勤天数、彩票号码连续出现次数,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)两种,默认使用全局分组,两者区别是:全局分组将输入表具备相同键值的所有行视为单一值。局部分组将具备相同键值的连续行作为一个单独分组。所以,当单一键值多次出现时,在全局分组下视为一个单值,而局部分组下则视为多值。

3
说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
1 评论数
2 被回复的评论
2 订阅评论的人数
 
查看最近回复
查看最热评论
  订阅本文评论  
最新 最旧 得票最多
提醒
成员
lyliuyouyang

高飞老师,powerquery里的第三参数再这个例子中这有奇效,但是和dax相比,效果是不一样的,dax是在原始表格上添加列,但是powerquery里是分组后的结果,虽然是局部分组,但行数有删减。有没有等效的做法?