当相关日期没有数据(过去和未来)时如何使用相同的度量进行计算?

How to calculate using the same measure when related date has no data (past and future)?

在尝试了很多方法和公式之后,我决定问这个问题。

查看此 Matrix 视觉效果:

WeekDate 是名为 Planning 的 table 中的列。它与另一个名为 Export.

的 table 中的另一个日期时间列 Week_Imported 有关

Export table 只有以下日期的值:23-Dec-19、30-Dec-19 和 06-Jan-20Planning table 的日期跨越过去和未来的多个星期。

只要 table 和 Export.

之间存在匹配日期,

Cumulative Plan Count 就会正确计算

现在我想继续计算,即使没有日期匹配。我想从具有数据的 FIRSTDATE 中获取值 32(在本例中为 2019 年 12 月 23 日)并用 32.

回填过去

对于未来的日期,我想使用 LASTDATE(20 年 1 月 6 日)值,即 89

像这样:

WeekDate          Cumulative Plan Count
.
.
.
25-Nov-19         32
02-Dec-19         32 
09-Dec-19         32
16-Dec-19         32
23-Dec-19         32 <= First WeekDate which has data [backfill past with 32]
30-Dec-19         57
06-Jan-19         89 <= Last WeekDate which has data [fill future with 89]
13-Jan-20         89
20-Jan-20         89
27-Jan-20         89
.
.
.

用于累计的公式SUM是这样的:

Cumulative Plan Count = 

CALCULATE (
    ROUNDUP([1 - Target] * MAX(Planning[1 - Plan]), 0)
    ,
    FILTER (
        ALL ( Planning[WeekDate] ),
        Planning[WeekDate] <= MAX(Planning[WeekDate])
    )
)

####### 编辑 1 #######

使用下面的这个度量,我得到了过去的 1s...

1 - Target = 

VAR minWeek = MIN(Export[Week_Imported])

VAR targetCount =
CALCULATE (
        COUNT( 'Export'[1 - Plan]),
        FILTER('Export', OR(Export[1 - Plan]="YES", Export[1 - Plan]="_")))

var minTarget = CALCULATE (
        COUNT( 'Export'[1 - Plan]),
        FILTER('Export', OR(Export[1 - Plan]="YES", Export[1 - Plan]="_")
        && Export[Week_Imported] = minWeek))

RETURN

SWITCH(TRUE,
targetCount = BLANK(),  1, // Here is where I need to get the 1st row value (32) and fill up the column up above...
targetCount)

问题是无论我做什么,我都无法获得 2019 年 12 月 23 日的第一个值 (32) 来填充累积计划计数列。

这是我用上面的公式得到的结果:

WeekDate          Cumulative Plan Count
.
.
.
25-Nov-19         1
02-Dec-19         1 
09-Dec-19         1
16-Dec-19         1
23-Dec-19         32 <= First WeekDate which has data
30-Dec-19         57
06-Jan-19         89 <= Last WeekDate which has data
13-Jan-20         89
20-Jan-20         89
27-Jan-20         89
.
.
.

####### 编辑 2 #######

I put together a simplified Sample.pbix which shows what I'm trying to accomplish with minimum data to test things: https://drive.google.com/drive/folders/1zxS_2VE9_0JEMXvsg9Dq196BK552RbNo?usp=sharing

This screenshot has more details: https://drive.google.com/open?id=1_-IMEpLwuWWN6vrrT_TNWbeqZ7f1LOan

让我介绍一下带有中间步骤的解决方案。

在您的数据架构中,PlanningExport table 是一对多关系。 Planning 每周都有,而 Export 每周有更多行。

Relationship diagram

在此基础上,每Planning周统计Export行数的度量就这么简单

Plan Count (Basic) = COUNTROWS ( 'Export' )

当您按 Planning[WeekDate] 切片时,此测量 returns 相应周的 Export 行的计数。

实际上,您需要 FILTER 才能只计算您感兴趣的行数。

Plan Count =
COUNTROWS (
    FILTER (
        'Export',
        OR ( 'Export'[Plan] = "YES", 'Export'[Plan] = "_" )
    )
)

这是我们目前得到的结果。

以这个度量为起点,我们需要将计算扩展到数据不存在的时期。为此,我们需要处理评估 [Plan Count] 的过滤器上下文。

我们需要获取存在 Export 数据的第一周和最后一周。这是一个公式 returns 数据的第一个日期,与切片器无关。

First Data Week =
CALCULATE (
    MIN ( Planning[WeekDate] ),
    REMOVEFILTERS ( Planning[WeekDate] ),
    TREATAS (
        CALCULATETABLE (
            VALUES ( 'Export'[Week_Imported] ), -- Foreign key referencing Planning[WeekDate]
            REMOVEFILTERS ( Planning )
        ),
        Planning[WeekDate]
    )
)

我们可以使用此日期修改过滤器上下文以计算第一个数据周的 [Plan Count]。事实上,低于测量总是returns 1064,这是2019年12月30日[Plan Count]的数量。

First Week Plan Count = 
VAR _FirstDataWeek = CALCULATE (
    MIN ( Planning[WeekDate] ),
    REMOVEFILTERS ( Planning[WeekDate] ),
    TREATAS (
        CALCULATETABLE (
            VALUES ( 'Export'[Week_Imported] ),
            REMOVEFILTERS ( Planning )
        ),
        Planning[WeekDate]
    )
)
RETURN
CALCULATE (
    [Plan Count],
    Planning[WeekDate] = _FirstDataWeek
)

使用这种技术,我们可以将 [Plan Count] 的第一个和最终值扩展到过去和未来的日期。下面是最终公式,它遍历 Planning table,并应用不同的过滤器上下文来计算 [Plan Count].

Extended Plan Count = 

-- Planning[WeekDate] values where Export data exists
VAR _DataWeeks = CALCULATETABLE (
    VALUES ( Planning[WeekDate] ),
    REMOVEFILTERS ( Planning[WeekDate] ),
    TREATAS (
        CALCULATETABLE (
            VALUES ( 'Export'[Week_Imported] ), -- Foreign key referencing Planning[WeekDate]
            REMOVEFILTERS ( Planning )
        ),
        Planning[WeekDate]
    )
)

-- First and last Planning[WeekDate] where Export data exists
VAR _FirstDataWeek = MINX ( _DataWeeks, [WeekDate] )
VAR _FinalDataWeek = MAXX ( _DataWeeks, [WeekDate] )

-- [Plan Count] values of first and last weeks
VAR _FirstDataWeekPlanCount = CALCULATE ( [Plan Count], Planning[WeekDate] = _FirstDataWeek )
VAR _FinalDataWeekPlanCount = CALCULATE ( [Plan Count], Planning[WeekDate] = _FinalDataWeek )

RETURN
SUMX (
    Planning,
    SWITCH (
        TRUE,
        Planning[WeekDate] < _FirstDataWeek, _FirstDataWeekPlanCount,
        Planning[WeekDate] > _FinalDataWeek, _FinalDataWeekPlanCount,
        [Plan Count]
    )
)