我对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))
对如何最好地解决这个问题有任何想法吗?
答案 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)。
享受!