You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 第一条数据(D2单元格)公式:
    =IF(C2="Success",0,0)
  2. 第二条及以后数据(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测试场景计算结果完全符合预期:

UserDateStatusStreak
John2021/5/1Success0
John2021/8/1Fail0
John2021/10/1Fail1

内容的提问来源于stack exchange,提问作者Victor J Mytre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:36:01