基于时间切片器动态统计最新版本结果数量的DAX实现
DAX度量值实现:基于切片器日期统计每个ID的最新版本记录数量
需求说明
现有数据集包含4个唯一ID,每个ID对应多个不同版本的记录。需创建DAX度量值,根据时间切片器选择的日期,仅统计每个ID的最新版本记录数量。
预期结果
- 2024/4/1:1条Open记录(ID:55)
- 2024/5/15:2条Open记录(ID:55、77),1条Closed记录(ID:66)
- 2024/8/1:2条Open记录(ID:88、55),2条Closed记录(ID:77、66)
现有配置
- 已创建与
Modified字段关联的Calendar表 - Version和ID字段设为整数,且设置为“不汇总”
- 版本号可能存在间隔,但版本越高对应的Modified日期越晚
已遇问题
硬编码日期变量dMax时可得到正确结果表,但改为动态获取MAX('Calendar'[Date])后无法正确响应切片器筛选;使用CALCULATE+COUNTROWS时出现错误或结果不符,需高效实现动态统计,无需完全重建结果表。
解决方案
1. 返回最新版本记录的表度量值
该度量值会返回符合切片器日期条件的所有ID最新版本记录,作为后续统计的基础:
最新版本记录 = VAR dMax = MAX('Calendar'[Date]) -- 聚合每个ID在选定日期前的最新Modified日期 VAR ID_LatestModified = SUMMARIZE( FILTER('sampleTable', 'sampleTable'[Modified] <= dMax), 'sampleTable'[ID], "LatestModified", MAX('sampleTable'[Modified]) ) -- 关联原表,筛选出每个ID的最新版本记录 VAR ResultTable = NATURALINNERJOIN( 'sampleTable', ID_LatestModified ) RETURN ResultTable
2. 按状态统计数量的度量值
基于上述表度量值,可分别创建统计Open/Closed记录数的度量值:
Open记录数 = COUNTROWS( FILTER([最新版本记录], [Status] = "Open") )
Closed记录数 = COUNTROWS( FILTER([最新版本记录], [Status] = "Closed") )
方案说明
原代码的问题在于嵌套筛选时上下文处理逻辑混乱,导致动态获取切片器日期时无法正确关联筛选上下文。使用SUMMARIZE先聚合每个ID的最新Modified日期,再通过NATURALINNERJOIN关联原表的方式,既保证了效率,又能正确响应切片器的动态筛选。
内容的提问来源于stack exchange,提问作者pgSystemTester
相关产品推荐
相关产品推荐

