DAX 获取最后一个销售正数的日期,无论日期行上下文如何

Prz*_*min 5 dax powerbi powerbi-desktop

如何获取销售金额最小日期和最大日期之间的所有日期的销售金额的最新日期。在表中,某些日期的金额可能为空。以下是预期结果的示例:

在此输入图像描述

这是我尝试过的。这些都是 DAX 指标。

LastDate = 
CALCULATE( 
    LASTDATE( Sales[Date] ), 
    REMOVEFILTERS( Sales[Date] ) 
)
Run Code Online (Sandbox Code Playgroud)
LastNonBlank = 
CALCULATE( 
    LASTNONBLANK( Sales[Date], [Sales] ),
    REMOVEFILTERS( Sales )
)
Run Code Online (Sandbox Code Playgroud)
MaxDate = 
CALCULATE( 
    MAX( Sales[Date] ), 
    REMOVEFILTERS( Sales[Date] ) 
)
Run Code Online (Sandbox Code Playgroud)
MaxDate_Filter = 
CALCULATE( 
    MAX( Sales[Date] ),
    FILTER( ALL( Sales ), Sales[Amount] > 0 )
)
Run Code Online (Sandbox Code Playgroud)

这是我得到的:

在此输入图像描述

因此,这些措施都没有产生预期的结果。

重现问题的表:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjIwMtA1MAQiJR0lEIYLmCjF6iDJGwHl8EgbA+VM8cibAOWM8cibQoxXio0FAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Date = _t, Amount = _t, #"Expected Result" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Amount", Int64.Type}, {"Expected Result", type date}})
in
    #"Changed Type"
Run Code Online (Sandbox Code Playgroud)

更新

在这里我找到了解决我的问题的有趣参考:

https://www.sqlbi.com/articles/hiding-future-dates-for-calculations-in-dax/

我们将计算列添加到 Sales 表中:

DatesWithSales = 
var CalendarDate = Sales[Date]
return
CalendarDate <= CALCULATE( MAX( Sales[Date] ), FILTER( ALLSELECTED( Sales ), Sales[Amount] > 0 ) ) &&
CalendarDate >= CALCULATE( MIN( Sales[Date] ), FILTER( ALLSELECTED( Sales ), Sales[Amount] > 0 ) )
Run Code Online (Sandbox Code Playgroud)

然后我们使用测量:

Expected Result = 
CALCULATE(
    MAX( Sales[Date] ),
    CALCULATETABLE(
        VALUES( Sales[Date] ), -- here can be whatever time intelligence function like SAMEPERIODLASTYEAR( Sales[Date] )
        Sales[DatesWithSales] = TRUE()
    )
)
Run Code Online (Sandbox Code Playgroud)

Ale*_*son 3

MaxDate_Filter看起来不错。如果您想删除超出该日期的日期,那么您可以这样做

Expected Result =
VAR RowDate = SELECTEDVALUE ( Sales[Date] )
RETURN
    IF ( RowDate <= [MaxDate_Filter], RowDate )
Run Code Online (Sandbox Code Playgroud)

或者,假设您已经定义了类似的[MinDate_Filter]并且想要在两侧进行过滤:

Expected Result =
VAR RowDate = SELECTEDVALUE ( Sales[Date] )
RETURN
    IF ( RowDate <= [MaxDate_Filter] && RowDate >= [MinDate_Filter], RowDate )
Run Code Online (Sandbox Code Playgroud)