如何使用DAX映射或统计当月数据中上月已存在的条目?
DAX实现跨月留存条目统计方案
核心需求说明
针对包含ID、date、item三个字段的业务数据集,筛选输出当月数据条目中、同时在上月同维度存在的记录。
结合给定示例的匹配逻辑:
- 12月(01.12.20)的条目共2条:ID=123对应item=one、ID=153对应item=three
- 上月(11月)的条目共2条:ID=123对应item=one、ID=143对应item=two
- 跨月匹配后仅ID=123、item=one的组合在两个月都存在,为预期输出结果
实现逻辑拆解
- 匹配判定单位是ID + item的组合,不是单独的ID值,同一ID如果当月的item和上月不一致,不算符合条件
- 先把文本格式的日期转成标准可计算的日期粒度,消除不同年份、不同日的同月份数据的匹配误差
- 对每一条当月记录,回溯检索前一个自然月的全量数据,判断是否存在完全一致的ID+item组合
可直接复用的DAX代码
第一步:先在业务表中新增基础转换列,解决文本日期无法计算的问题
// 将示例中带.分隔的文本日期转为标准日期 转换为标准日期 = DATEVALUE([date]) // 取记录所属月的月末值作为统一年月标识,方便跨月比对 记录所属年月 = EOMONTH([转换为标准日期], 0)
第二步:新增计算列,给符合跨月留存条件的条目打标记
是否为上月已存在条目 = VAR 当前记录年月 = '业务表'[记录所属年月] VAR 当前匹配键 = '业务表'[ID] & "|" & '业务表'[item] // 检索上月是否存在完全一致的ID+item组合 VAR 上月匹配数 = CALCULATE( COUNTROWS('业务表'), ALL('业务表'), // 解除当前行的上下文限制,全表检索上月数据 '业务表'[记录所属年月] = EOMONTH(当前记录年月, -1), '业务表'[ID] & "|" & '业务表'[item] = 当前匹配键 ) RETURN IF(上月匹配数 > 0, 1, 0)
第三步:按需输出结果
- 如果需要展示符合条件的条目明细:在可视化表中拖入
ID、item字段,添加筛选规则——是否为上月已存在条目 = 1,即可得到示例中预期的「123 / one」结果 - 如果需要统计符合条件的条目总数量,可直接写度量值:
跨月留存条目总数 = CALCULATE( DISTINCTCOUNT('业务表'[ID] & "|" & '业务表'[item]), '业务表'[是否为上月已存在条目] = 1 )
实现注意事项
- 匹配键不要只用ID拼接单值,必须把item纳入组合维度,否则会出现同一ID跨月换了item却被误判为符合条件的问题
- 检索上月数据时要注意保留外部切片器的筛选上下文,不要因为ALL函数把无关的筛选范围全部清除,导致匹配范围超出预期
- 日期转换阶段要校验原始文本日期的格式,避免因文本格式不统一导致DATEVALUE计算报错
内容的提问来源于stack exchange,提问作者Shalva Bareladze
相关产品推荐
相关产品推荐

