You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于月度最大日期的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_RefVersion_DateOther_Attributes
Ref12020-03-20...
Ref22020-03-20...
Ref12020-04-11...
Ref22020-04-11...
Ref32020-04-11...
Ref12020-04-15...
Ref22020-04-15...
Ref32020-04-15...
Ref12020-04-24...
Ref22020-04-24...
Ref32020-04-24...
Ref42020-04-24...

预期结果

咱们要得到的最终统计效果是:

Month YearCount_Of_Doc_Ref
March 20202
April 20204

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)
)

原公式的问题分析

  1. 变量冗余:VersionLessThan的逻辑其实就是取当前上下文的最大版本日期,直接用MAX('Axis Doc_Ref'[Version Date])就行,没必要套SELECTEDVALUE。
  2. 重复计算:RETURN里的外层CALCULATE完全复制了OngoingEWPerMonth的逻辑,这个变量可以直接复用,减少重复代码。
  3. 筛选逻辑偏差:原公式里的FILTER(all(...), Version Date <= VersionLessThan)会包含同一月份的所有旧版本,没有精准定位到“每月最后一个版本日期”,不符合需求。
  4. 关系依赖验证: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:12:32