DAX实现用户连续失败次数统计(遇成功重置,支持间隔月份)
连续失败次数(Streak)计算方案
核心逻辑说明
不需要处理缺失的空月份,仅需按用户分组+日期升序排序后,逐行取同用户上一条有记录的状态判断即可,完全适配日期不连续场景:
- 当前行Status为Success,Streak直接置0
- 当前行Status为Fail时,判断同用户上一条记录的状态:
- 没有上一条记录/上一条状态为Success:Streak置0
- 上一条状态为Fail:Streak = 上一条Streak + 1
方案1:纯Excel工作表公式实现(无需Power Query/Power Pivot)
前置操作
选中整个数据区域,自定义排序:
- 第一排序关键字:
User,升序 - 第二排序关键字:
Date,升序
公式设置
假设表头在第1行,数据从第2行开始,列对应关系:A=User、B=Date、C=Status、D=Streak:
- 第一条数据(D2单元格)公式:
=IF(C2="Success",0,0) - 第二条及以后数据(D3单元格开始往下批量填充)公式:
=IF(C3="Success",0,IF(A3=A2,IF(C2="Success",0,D2+1),0))
方案2:DAX计算列实现(适用于Power Pivot/Excel数据模型)
无需提前排序,直接在数据模型中新建计算列,替换公式中的表名为你实际的表名即可:
Streak = VAR CurrentUser = '表名'[User] VAR CurrentDate = '表名'[Date] VAR CurrentStatus = '表名'[Status] // 取当前用户最近一条历史记录的日期 VAR LastRecordDate = MAXX(FILTER('表名', '表名'[User] = CurrentUser && '表名'[Date] < CurrentDate), '表名'[Date]) // 取最近一条历史记录的状态 VAR LastStatus = IF(ISBLANK(LastRecordDate), BLANK(), MAXX(FILTER('表名', '表名'[User] = CurrentUser && '表名'[Date] = LastRecordDate), '表名'[Status])) // 取最近一条历史记录的Streak值 VAR LastStreak = IF(ISBLANK(LastRecordDate), 0, MAXX(FILTER('表名', '表名'[User] = CurrentUser && '表名'[Date] = LastRecordDate), '表名'[Streak])) RETURN SWITCH( TRUE(), CurrentStatus = "Success", 0, ISBLANK(LastStatus), 0, LastStatus = "Success", 0, LastStreak + 1 )
效果验证
你提到的John测试场景计算结果完全符合预期:
| User | Date | Status | Streak |
|---|---|---|---|
| John | 2021/5/1 | Success | 0 |
| John | 2021/8/1 | Fail | 0 |
| John | 2021/10/1 | Fail | 1 |
内容的提问来源于stack exchange,提问作者Victor J Mytre
相关产品推荐
相关产品推荐

