Power BI复杂计算列

时间:2020-07-09 09:48:23

标签: powerbi dax powerquery calculated-columns

我对Power BI还是很陌生,我尝试查询Azure DevOps数据以获取具有历史数据的委员会。

我制作了一个OData提要,用于查询数据并返回下面的数据(见表),对于IsCurrent = True的每一行,我想将“阻塞时间”计算为一个新值该BlockedTime WorkItemId 列。因此,我需要遍历该WorkItemId的记录并进行日期计算。

在深入研究CALCULATE,Filters和更多内容之后,我目前陷入困境。

我为WorkItemId 1、72和149指定了三种方案。

在下面的计算中,我将“索引”列用作参考行的编号。

我的查询返回以下内容:

WorkItemId Revision Index AnalyticsUpdatedDate IsCurrent TagNames BlockedTime
        72        7     0 06/19/2020 11.41.04  True               See calculation 1  
        72        6     1 06/19/2020 11.41.04  False     Blocked
        72        5     2 06/18/2020 10.41.23  False     Blocked
        72        4     3 06/17/2020 09.38.54  False     
        72        3     4 06/16/2020 14.22.21  False     Blocked
        72        2     5 06/15/2020 15.01.02  False     
        72        1     6 06/14/2020 07.21.16  False     
         1        6     7 07/07/2020 09:58:12  True      Blocked  See calculation 2  
         1        5     8 07/07/2020 09:58:12  False     
         1        4     9 07/06/2020 10:22:02  False     Blocked
         1        3    10 07/05/2020 12:34:31  False     
         1        2    11 07/04/2020 13:51:30  False     Blocked
         1        1    12 07/03/2020 08:23:41  False     
        149       1    13 07/02/2020 10:01:55  False     Blocked See calculation 3

规则

变量CurrentDate包含当前的DateTime

TagNames包含给定行的“被阻止”文本时,它被视为与AnalyticsUpdatedDate中的日期/时间被阻止,并且时间应通过在记录中向下移动来“向后”计算(修订版)数字向下)并汇总,直到遇到TagNames中没有“阻塞”的行

计算1:计算BLOCKED TIME,并将结果放入BlockedTime(0)

(AnalyticsUpdatedDate(1) - AnalyticsUpdatedDate(2)) + 
(AnalyticsUpdatedDate(2) - AnalyticsUpdatedDate(3)) + 
(AnalyticsUpdatedDate(4) - AnalyticsUpdatedDate(5))

计算2:计算BLOCKED TIME,并将结果放入BlockedTime(7)

(CurrentDate - AnalyticsUpdatedDate(7)) + 
(AnalyticsUpdatedDate(9) - AnalyticsUpdatedDate(10)) + 
(AnalyticsUpdatedDate(11) - AnalyticsUpdatedDate(12))

计算3:计算BLOCKED TIME,并将结果放入BlockedTime(13)

(CurrentDate - AnalyticsUpdatedDate(13))

对如何最好地解决这个问题有任何想法吗?

1 个答案:

答案 0 :(得分:1)

所以我们开始。我分3步,由3列组成了它,因此它更容易理解,您可以在一个脚本中完成它。

首先,我们需要找到所有发行版本的日期(当该区块不再存在时)

我们使用以下列:

Released = 
var workItemId = Track[WorkItemId]
var Revision = Track[Revision]
var ReleaseTime = CALCULATE(MIN(Track[AnalyticsUpdatedDate]), FILTER(Track, Track[WorkItemId] = workItemId && Revision < Track[Revision]))
var ReleaseFinal = if (ISBLANK(ReleaseTime), NOW(), ReleaseTime)
return if(Track[TagNames] = "Blocked", ReleaseFinal)

在计算中,我得到第一行(MIN),该行用于确保该项目具有与更高版本相同的workItemId。

如果找不到发布时间,则表示该项目仍被阻止,因此我用NOW()填充ReleaseFinal。

由于我只想在项目被阻止时输出,所以在最后一次返回时会有一个if

下一步,我创建一个新列以秒为单位计算差异:

SecDiff = DATEDIFF(Track[AnalyticsUpdatedDate],Track[Released], SECOND)

我创建的最后一列用于汇总秒数,并使用IsCurrent = True填充该列:

TotalBlockedTime = 
var WorkItemId = Track[WorkItemId]
return if (Track[IsCurrent], CALCULATE(SUM(Track[SecDiff]), FILTER(Track, Track[WorkItemId] = WorkItemId)))

最终结果,请参见下文。我认为您的数据不是100%,因为您的第三个示例Iscurrent = false(应为true)。

enter image description here

享受!