当相关日期没有数据(过去和未来)时如何使用相同的度量进行计算?
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-20 而Planning
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
让我介绍一下带有中间步骤的解决方案。
在您的数据架构中,Planning
和 Export
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]
)
)
在尝试了很多方法和公式之后,我决定问这个问题。
查看此 Matrix 视觉效果:
WeekDate
是名为 Planning
的 table 中的列。它与另一个名为 Export
.
Week_Imported
有关
Export
table 只有以下日期的值:23-Dec-19、30-Dec-19 和 06-Jan-20 而Planning
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
让我介绍一下带有中间步骤的解决方案。
在您的数据架构中,Planning
和 Export
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]
)
)