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

如何创建计算过去21天平均支出的度量值?现有公式返回无效值

问题排查与修正方案

原公式的核心问题

  • 误用事实表日期层级:'Raw_Data'[Date_1].[Day]是日期字段的层级引用,而非完整日期列,会导致DATESBETWEEN无法生成连续的日期范围,尤其当事实表存在日期缺失时,窗口范围会直接断裂。
  • LASTDATE的上下文缺陷:直接基于事实表日期列取LASTDATE,如果事实表中没有最新日期的记录,会返回空值,导致后续计算全失效。
  • 冗余的CALCULATE嵌套:AVERAGEX内部的CALCULATE(AVERAGE('Raw_Data'[Spend]))属于多余操作,AVERAGEX本身会逐行迭代日期范围,CALCULATE触发的上下文转换会干扰计算逻辑,最终导致返回0或空值。
  • 无专用日期表支撑:滚动平均需要连续的日期序列,仅依赖事实表的日期列会因日期缺失导致窗口不完整,无法准确覆盖21天周期。

修正后的DAX公式

前提:创建专用日期表

先建立一个包含连续日期的专用日期表(命名为DateTable),并与Raw_Data的Date_1列建立关联(一对一或一对多均可)。

基础版滚动平均(包含无支出的日期)

21天滚动平均支出 = 
VAR __当前最大日期 = MAX('DateTable'[Date])
VAR __滚动窗口 = DATESBETWEEN(
    'DateTable'[Date],
    __当前最大日期 - 21,
    __当前最大日期
)
RETURN
AVERAGEX(
    __滚动窗口,
    CALCULATE(SUM('Raw_Data'[Spend]))
)

进阶版(仅计算有支出记录的日期)

如果需要忽略无支出的日期,只计算有数据的日期平均值,可使用以下公式:

21天滚动平均支出(仅含有效日期) = 
VAR __当前最大日期 = MAX('DateTable'[Date])
VAR __滚动窗口 = DATESBETWEEN(
    'DateTable'[Date],
    __当前最大日期 - 21,
    __当前最大日期
)
VAR __每日支出明细 = 
ADDCOLUMNS(
    __滚动窗口,
    "@单日支出", CALCULATE(SUM('Raw_Data'[Spend]))
)
RETURN
AVERAGEX(
    FILTER(__每日支出明细, [@单日支出] <> BLANK()),
    [@单日支出]
)

关键调整说明

  • 专用日期表保障连续性:确保21天窗口是完整的连续日期,即使某天无支出数据也会纳入计算(基础版中无支出日期按0处理,进阶版则直接过滤)。
  • 简化日期范围计算:用__当前最大日期 - 21替代DATEADD,避免层级引用带来的异常,逻辑更直观。
  • 替换AVERAGE为SUM:迭代中先计算单日总支出,再取21天的平均,避免原公式中单日多记录时的平均偏差问题。

内容的提问来源于stack exchange,提问作者hockeybum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:21:07