Power BI中用DAX计算值的连续出现次数(Streak列需求)
正确DAX实现连续UsedMLLWOP=1次数统计(Streak列)
针对你的需求,以下是符合规则的DAX计算列实现:
Streak = VAR CurrentPerson = '22PPReport-VetList'[PersonnelNumber] VAR CurrentPeriod = '22PPReport-VetList'[PayPeriodID] VAR CurrentValue = '22PPReport-VetList'[UsedMLLWOP] -- 查找当前人员在当前周期之前最后一个UsedMLLWOP=0的周期 VAR LastZeroPeriod = CALCULATE( MAX('22PPReport-VetList'[PayPeriodID]), FILTER( ALL('22PPReport-VetList'), '22PPReport-VetList'[PersonnelNumber] = CurrentPerson && '22PPReport-VetList'[UsedMLLWOP] = 0 && '22PPReport-VetList'[PayPeriodID] < CurrentPeriod ) ) -- 处理无前置0的情况:取该人员最小周期减1,确保第一个1从1开始计数 VAR StartPeriod = IF( ISBLANK(LastZeroPeriod), MINX( FILTER(ALL('22PPReport-VetList'), '22PPReport-VetList'[PersonnelNumber] = CurrentPerson), '22PPReport-VetList'[PayPeriodID] ) - 1, LastZeroPeriod ) -- 统计从起始点到当前周期内连续的UsedMLLWOP=1的次数 VAR StreakCount = CALCULATE( COUNTROWS('22PPReport-VetList'), FILTER( ALL('22PPReport-VetList'), '22PPReport-VetList'[PersonnelNumber] = CurrentPerson && '22PPReport-VetList'[PayPeriodID] > StartPeriod && '22PPReport-VetList'[PayPeriodID] <= CurrentPeriod && '22PPReport-VetList'[UsedMLLWOP] = 1 ) ) RETURN IF(CurrentValue = 0, 0, StreakCount)
代码逻辑说明
- 基础变量定义:获取当前行的人员编号、周期编号和UsedMLLWOP值,确保计算基于当前行上下文。
- 查找最近的前置0周期:定位当前人员在当前周期之前最后一个UsedMLLWOP=0的记录,这个点是连续1的起始分界点。
- 处理无前置0的场景:如果当前人员在当前周期之前没有UsedMLLWOP=0的记录(比如首次出现1),则用该人员的最小周期减1作为起始点,保证第一个1的计数从1开始。
- 统计连续次数:计算从分界点之后到当前周期内,所有UsedMLLWOP=1的行数,即为当前的连续次数。
- 返回结果:如果当前行UsedMLLWOP=0,直接返回0;否则返回统计的连续次数。
原代码问题分析
- 语法错误:原代码中使用了HTML转义字符
&&,实际DAX中需要使用&&作为逻辑与运算符,这会导致代码无法正常运行。 - 上下文错误:计算列中使用
SELECTEDVALUE不合适,SELECTEDVALUE主要用于度量值的筛选上下文,计算列应直接引用当前行字段(如'22PPReport-VetList'[PersonnelNumber])来获取准确的行上下文值。 - 无前置0的场景未处理:当当前人员首次出现UsedMLLWOP=1时,
lastweekStart会返回空白,此时PayPeriodID >= lastweekStart会包含所有历史记录,逻辑上存在隐患,比如如果人员之前有非连续的1,会导致计数错误。
内容的提问来源于stack exchange,提问作者Qwest336
相关产品推荐
相关产品推荐

