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

Power BI价格上涨标记公式优化:获取首个FALSE前最小日期ASP

需求与解决方案

问题描述

我需要创建一个DAX公式实现以下逻辑:

  • 仅当最新日期的ANY_PRICE_INC为TRUE时,才返回对应值;
  • 返回的是从最新日期往前追溯,第一个FALSE结果之前的连续TRUE区间的最早日期对应的ASP值(如示例中标记的$45.81,对应日期5/6/2023,该日期之后的所有记录ANY_PRICE_INC均为TRUE,直到最新日期);
  • 不取全表中第一个或最后一个TRUE值,只取最新连续TRUE区间的起始日期对应的ASP。

现有DAX公式无法实现该逻辑,它取的是全表所有TRUE记录中的最小日期,而非目标连续区间的起始日期。

现有DAX公式

Price INC flag =
    VAR __CurrentDate = MAX( 'Sales - Market Level'[DATE] )
    VAR __MaxDate = MAXX(ALLSELECTED('Sales - Market Level'[DATE]),'Sales - Market Level'[DATE])
    VAR __IsTrue = SELECTCOLUMNS(FILTER( ALLSELECTED( 'Sales - Market Level' ), [ANY_PRICE_INC] = TRUE() && [DATE] = __MaxDate ), "__AnyPriceInc", [ANY_PRICE_INC] )
    VAR __MinDate = MINX( FILTER( ALLSELECTED( 'Sales - Market Level'), [ANY_PRICE_INC] = TRUE() ), [DATE] )
    VAR __MinDateRate = MAXX( FILTER( ALLSELECTED( 'Sales - Market Level' ), [ANY_PRICE_INC] = TRUE() && [DATE] = __MinDate ), [ASP] )
    VAR __Result = IF( __IsTrue && __CurrentDate = __MinDate, __MinDateRate, BLANK() )
RETURN
    __Result

示例数据表

DATEASPANY_PRICE_DECANY_PRICE_INC预期Flag
8/26/2023 0:00$49.23FALSETRUE
8/19/2023 0:00$49.65FALSETRUE
8/12/2023 0:00$47.09FALSETRUE
8/5/2023 0:00$48.68FALSETRUE
6/24/2023 0:00$40.66FALSETRUE
6/17/2023 0:00$46.03FALSETRUE
6/10/2023 0:00$47.61FALSETRUE
6/3/2023 0:00$48.60FALSETRUE
5/27/2023 0:00$48.19FALSETRUE
5/20/2023 0:00$45.53FALSETRUE
5/13/2023 0:00$48.08FALSETRUE
5/6/2023 0:00$45.81FALSETRUE$45.81
3/25/2023 0:00$39.15FALSEFALSE
3/18/2023 0:00$38.77FALSETRUE
3/11/2023 0:00$39.09FALSETRUE
3/4/2023 0:00$38.52FALSEFALSE
1/28/2023 0:00$38.87FALSEFALSE

修改后的DAX公式

Price INC flag =
VAR __MaxDate = MAXX(ALLSELECTED('Sales - Market Level'[DATE]), 'Sales - Market Level'[DATE])
VAR __LatestIsTrue = CALCULATE(MAX('Sales - Market Level'[ANY_PRICE_INC]), 'Sales - Market Level'[DATE] = __MaxDate)
VAR __LastFalseDate = MAXX(
    FILTER(ALLSELECTED('Sales - Market Level'), 
        'Sales - Market Level'[ANY_PRICE_INC] = FALSE() && 'Sales - Market Level'[DATE] < __MaxDate
    ),
    'Sales - Market Level'[DATE]
)
VAR __StartOfTrueRange = MINX(
    FILTER(ALLSELECTED('Sales - Market Level'), 
        'Sales - Market Level'[DATE] > __LastFalseDate && 'Sales - Market Level'[ANY_PRICE_INC] = TRUE()
    ),
    'Sales - Market Level'[DATE]
)
VAR __TargetASP = CALCULATE(MAX('Sales - Market Level'[ASP]), 'Sales - Market Level'[DATE] = __StartOfTrueRange)
VAR __CurrentDate = MAX('Sales - Market Level'[DATE])
RETURN
    IF(__LatestIsTrue && __CurrentDate = __StartOfTrueRange, __TargetASP, BLANK())

公式逻辑解释

  • __MaxDate:获取当前筛选范围内的最新日期;
  • __LatestIsTrue:判断最新日期的ANY_PRICE_INC是否为TRUE,只有满足此条件才继续后续计算;
  • __LastFalseDate:找到最新日期之前的最后一个ANY_PRICE_INC为FALSE的日期;如果所有日期(除最新外)都是TRUE,则该值为空;
  • __StartOfTrueRange:筛选出日期晚于__LastFalseDate的所有TRUE记录,取其中的最小日期——也就是最新连续TRUE区间的起始日期;
  • __TargetASP:获取起始日期对应的ASP值;
  • 返回结果:仅当最新日期为TRUE且当前行日期等于起始日期时,返回__TargetASP,否则返回空值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:45:07