基于月度最大日期的DAX度量值计算与KPI创建求助
计算每月最后版本文档数量的KPI实现与DAX验证优化
需求背景
咱们有一张表Doc_Table,包含Doc_Ref、Version_Date、Other_Attributes列,每行由Doc_Ref和Version_Date的组合唯一标识。核心需求是统计每个月最后一个版本日期对应的文档数量——举个例子,4月有11/4、15/4、24/4三个版本日期,咱们只需要统计24/4这个版本下的文档数。
对应SQL实现
先给你看最初思路的SQL语句(不过这里要提一句,原SQL的子查询返回了两列,IN子句只能匹配单值,实际运行可能会报错,后续DAX会修正这个逻辑):
Select count(Doc_Ref) From Doc_Table Where Month(Version_Date) in ( Select MAX(Version_Date), Month(Version_Date) From Doc_Table Group By Month(Version_Date) )
测试数据
我把你提供的测试数据转成了更清晰的表格:
| Doc_Ref | Version_Date | Other_Attributes |
|---|---|---|
| Ref1 | 2020-03-20 | ... |
| Ref2 | 2020-03-20 | ... |
| Ref1 | 2020-04-11 | ... |
| Ref2 | 2020-04-11 | ... |
| Ref3 | 2020-04-11 | ... |
| Ref1 | 2020-04-15 | ... |
| Ref2 | 2020-04-15 | ... |
| Ref3 | 2020-04-15 | ... |
| Ref1 | 2020-04-24 | ... |
| Ref2 | 2020-04-24 | ... |
| Ref3 | 2020-04-24 | ... |
| Ref4 | 2020-04-24 | ... |
预期结果
咱们要得到的最终统计效果是:
| Month Year | Count_Of_Doc_Ref |
|---|---|
| March 2020 | 2 |
| April 2020 | 4 |
DAX公式验证与优化
先看你基于回复写出的DAX公式:
NB of Ongoing Doc Ref Shared = VAR VersionLessThan = SELECTEDVALUE('Axis Doc_Ref'[Version Date];MAX('Axis Doc_Ref'[Version Date])) VAR OngoingEWPerMonth = CALCULATE ( [NB of Ongoing Doc Ref] ;FILTER('Axis Doc_Ref';'Axis Doc_Ref'[Version Date] = MAX('Axis Doc_Ref'[Version Date])) ) RETURN CALCULATE ( CALCULATE ( [NB of Ongoing Doc Ref] ;FILTER('Axis Doc_Ref';'Axis Doc_Ref'[Version Date] = MAX('Axis Doc_Ref'[Version Date])) ) ;USERELATIONSHIP('Axis Doc_Ref'[Version Date];'Axis EW Created Date'[Date - Created]) ;FILTER(all('Axis Doc_Ref'[Version Date]); 'Axis Doc_Ref'[Version Date] <= VersionLessThan) )
原公式的问题分析
- 变量冗余:
VersionLessThan的逻辑其实就是取当前上下文的最大版本日期,直接用MAX('Axis Doc_Ref'[Version Date])就行,没必要套SELECTEDVALUE。 - 重复计算:RETURN里的外层CALCULATE完全复制了
OngoingEWPerMonth的逻辑,这个变量可以直接复用,减少重复代码。 - 筛选逻辑偏差:原公式里的
FILTER(all(...), Version Date <= VersionLessThan)会包含同一月份的所有旧版本,没有精准定位到“每月最后一个版本日期”,不符合需求。 - 关系依赖验证:
USERELATIONSHIP需要确保两个表之间存在非活跃关系,否则运行会报错,得确认这个关系的合理性。
优化后的DAX公式
我给你提供两种更精准的实现方式:
方式一:先锁定每月最后版本日期,再统计
NB of Monthly Last Version Docs = VAR MonthLastVersionDates = ADDCOLUMNS( SUMMARIZE('Axis Doc_Ref', YEAR('Axis Doc_Ref'[Version Date]), MONTH('Axis Doc_Ref'[Version Date])), "@LastVersionDate", CALCULATE(MAX('Axis Doc_Ref'[Version Date])) ) VAR FilteredLastVersionDocs = FILTER( 'Axis Doc_Ref', ('Axis Doc_Ref'[Version Date] IN SELECTCOLUMNS(MonthLastVersionDates, "@Date", [@LastVersionDate])) ) RETURN CALCULATE( [NB of Ongoing Doc Ref], FilteredLastVersionDocs, USERELATIONSHIP('Axis Doc_Ref'[Version Date], 'Axis EW Created Date'[Date - Created]) )
逻辑拆解:
- 先按年、月分组,算出每个月的最后版本日期
- 筛选出所有版本日期等于对应月份最后版本日期的文档行
- 最后统计这些行的文档数,同时应用指定的表关系
方式二:上下文转换实现(更简洁)
NB of Monthly Last Version Docs = CALCULATE( [NB of Ongoing Doc Ref], FILTER( 'Axis Doc_Ref', 'Axis Doc_Ref'[Version Date] = CALCULATE( MAX('Axis Doc_Ref'[Version Date]), ALLEXCEPT('Axis Doc_Ref', YEAR('Axis Doc_Ref'[Version Date]), MONTH('Axis Doc_Ref'[Version Date])) ) ), USERELATIONSHIP('Axis Doc_Ref'[Version Date], 'Axis EW Created Date'[Date - Created]) )
逻辑拆解:
- 对每一行文档,判断其版本日期是否等于同一年月下的最大版本日期
- 筛选符合条件的行后统计数量,同时应用指定关系
验证说明
针对你的测试数据:
- 2020年3月最后版本日期是2020-03-20,对应2个文档,统计结果为2,符合预期
- 2020年4月最后版本日期是2020-04-24,对应4个文档,统计结果为4,符合预期
额外提醒:
- 要确保
[NB of Ongoing Doc Ref]是正确统计Doc_Ref数量的度量值(比如用DISTINCTCOUNT('Axis Doc_Ref'[Doc_Ref])) - 如果
USERELATIONSHIP中的关系是活跃的,就不需要这个参数,DAX会自动使用
内容的提问来源于stack exchange,提问作者h0007
相关产品推荐
相关产品推荐

