Power BI 按月统计去重客户数的计算列编写问题咨询
你现有代码的问题是没有将筛选范围限定为当前行所属的完整月份,CALCULATE转换行上下文时仅筛选了当前行对应的单日维度,统计范围不符合需求。
根据你两种常见的计算列使用场景,对应代码如下:
场景1:每行显示当前月的总去重客户数(同月所有行数值一致)
myCol = CALCULATE( DISTINCTCOUNT('table'[user_id]), FILTER( ALL('table'), YEAR('table'[order_date]) = YEAR(EARLIER('table'[order_date])) && MONTH('table'[order_date]) = MONTH(EARLIER('table'[order_date])) ) )
逻辑说明:用EARLIER函数获取当前行订单日期对应的年、月,筛选全表中所有同年月的订单数据,再对用户ID去重计数,即可得到当月的去重客户总量,同一个月的所有行返回值一致,不会重复统计多笔订单的同一个客户。
如果你的表中已提前生成了格式统一的年月列(如order_month,值为2023-01这类),可以用ALLEXCEPT简化代码,性能也更优:
myCol = CALCULATE( DISTINCTCOUNT('table'[user_id]), ALLEXCEPT('table', 'table'[order_month]) )
场景2:单个客户当月仅在1行标记为1,其余行标记为0(用于后续聚合统计)
如果你需要后续可通过求和该列直接得到任意时间范围的去重客户数,可使用如下代码:
myCol = IF( CALCULATE( COUNTROWS('table'), FILTER( 'table', 'table'[user_id] = EARLIER('table'[user_id]) && YEAR('table'[order_date]) = YEAR(EARLIER('table'[order_date])) && MONTH('table'[order_date]) = MONTH(EARLIER('table'[order_date])) && 'table'[order_id] < EARLIER('table'[order_id]) ) ) = 0, 1, 0 )
逻辑说明:假设order_id是订单表的自增主键,代码会判断当前行是否是该用户当月的第一笔订单,是则标记1,否则标记0,保证同一个用户同一个月仅被计数1次。
内容的提问来源于stack exchange,提问作者WhoIsKi
相关产品推荐
相关产品推荐

