Power BI DAX技术问询:计算特定活动中多次参会的重复用户数
解决特定活动中重复参会者统计的DAX问题
业务场景
需要统计当前选中活动中,参与过其他活动不止一次的参会者数量,用于评估客户留存。例如:
- 总活动200场,总参会人次18450,独立参会者6064人,其中3957人参与过≥2场活动
- 选中活动ID:A1234(1734名参会者)时,需计算该活动里属于上述3957人中的数量
现有问题
编写的DAX公式无论筛选任何活动,结果始终返回全量重复参会者数3957,未随筛选条件变化:
RepeatAttendeesCount = CALCULATE( COUNTROWS(DISTINCT(TEST_EVENT_REPORT[PIDM])), FILTER( ALL(TEST_EVENT_REPORT), CALCULATE( COUNTROWS(TEST_EVENT_REPORT), FILTER( ALL(TEST_EVENT_REPORT), TEST_EVENT_REPORT[PIDM] = EARLIER(TEST_EVENT_REPORT[PIDM]) ) ) > 1 ) )
问题根源
公式中两次使用ALL(TEST_EVENT_REPORT),直接移除了所有筛选上下文(包括活动ID的筛选),导致计算逻辑始终基于全表数据,自然不会随活动筛选变化。
修正后的DAX公式
写法一(使用变量更清晰)
RepeatAttendeesCount = -- 获取当前筛选活动的所有参会者ID VAR CurrentEventPIDs = VALUES(TEST_EVENT_REPORT[PIDM]) -- 筛选出其中参与过≥2场活动的参会者 VAR RepeatPIDs = FILTER( CurrentEventPIDs, CALCULATE( COUNTROWS(DISTINCT(TEST_EVENT_REPORT[活动ID])), ALL(TEST_EVENT_REPORT[活动ID]) -- 仅移除活动ID筛选,保留PIDM上下文 ) > 1 ) -- 返回符合条件的人数 RETURN COUNTROWS(RepeatPIDs)
写法二(简化版)
RepeatAttendeesCount = CALCULATE( COUNTROWS(DISTINCT(TEST_EVENT_REPORT[PIDM])), FILTER( VALUES(TEST_EVENT_REPORT[PIDM]), -- 保留当前活动的参会者筛选 CALCULATE( COUNTROWS(DISTINCT(TEST_EVENT_REPORT[活动ID])), ALL(TEST_EVENT_REPORT[活动ID]) ) > 1 ) )
逻辑说明
VALUES(TEST_EVENT_REPORT[PIDM]):保留当前活动的筛选上下文,只获取该活动的参会者IDCALCULATE(COUNTROWS(DISTINCT(TEST_EVENT_REPORT[活动ID])), ALL(TEST_EVENT_REPORT[活动ID])):针对每个参会者ID,计算其在所有活动中参与的不同活动数量(仅移除活动ID的筛选,保留PIDM的上下文)- 最后统计总活动数>1的参会者数量,即为目标结果
验证效果
- 选中特定活动(如A1234)时,返回该活动中参与过多次活动的人数
- 选中全部活动时,返回全量重复参会者数3957,符合预期
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

