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
示例数据表
| DATE | ASP | ANY_PRICE_DEC | ANY_PRICE_INC | 预期Flag |
|---|---|---|---|---|
| 8/26/2023 0:00 | $49.23 | FALSE | TRUE | |
| 8/19/2023 0:00 | $49.65 | FALSE | TRUE | |
| 8/12/2023 0:00 | $47.09 | FALSE | TRUE | |
| 8/5/2023 0:00 | $48.68 | FALSE | TRUE | |
| 6/24/2023 0:00 | $40.66 | FALSE | TRUE | |
| 6/17/2023 0:00 | $46.03 | FALSE | TRUE | |
| 6/10/2023 0:00 | $47.61 | FALSE | TRUE | |
| 6/3/2023 0:00 | $48.60 | FALSE | TRUE | |
| 5/27/2023 0:00 | $48.19 | FALSE | TRUE | |
| 5/20/2023 0:00 | $45.53 | FALSE | TRUE | |
| 5/13/2023 0:00 | $48.08 | FALSE | TRUE | |
| 5/6/2023 0:00 | $45.81 | FALSE | TRUE | $45.81 |
| 3/25/2023 0:00 | $39.15 | FALSE | FALSE | |
| 3/18/2023 0:00 | $38.77 | FALSE | TRUE | |
| 3/11/2023 0:00 | $39.09 | FALSE | TRUE | |
| 3/4/2023 0:00 | $38.52 | FALSE | FALSE | |
| 1/28/2023 0:00 | $38.87 | FALSE | FALSE |
修改后的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
相关产品推荐
相关产品推荐

