powerbi - 如何使用 DAX 计算同一 id 的两个不同状态转换之间的天数差异
问题描述
首先,我将从一个示例数据开始,我将根据它解释我想要的结果:
指数 | ID | 时间戳 | 地位 |
---|---|---|---|
1 | 25730 | 2020-06-24 07:22:31.297 | 进行中 |
2 | 25730 | 2020-06-29 06:28:20.193 | 准备好 |
3 | 25730 | 2020-06-30 07:21:05.147 | 进行中 |
4 | 25730 | 2020-06-30 09:40:27.670 | 准备好 |
5 | 25730 | 2020-07-01 07:23:11.277 | 进行中 |
6 | 25730 | 2020-07-05 11:06:02.413 | 准备好 |
110 | 25735 | 2020-06-30 09:36:04.050 | 准备好 |
141 | 25738 | 2020-06-28 11:49:09.557 | 进行中 |
142 | 25738 | 2020-06-28 11:51:44.503 | 准备好 |
143 | 25738 | 2020-06-29 05:05:45.777 | 进行中 |
144 | 25738 | 2020-06-29 05:12:54.617 | 准备好 |
145 | 25738 | 2020-07-13 12:17:46.873 | 准备好 |
146 | 25738 | 2020-07-15 16:21:09.667 | 进行中 |
147 | 25738 | 2020-07-20 16:46:59.840 | 准备好 |
148 | 25738 | 2020-07-24 16:49:57.003 | 进行中 |
基于上述示例,我正在尝试计算状态转换之间的天数差异。更具体地说,一个 id 需要多长时间才能从“ Ready ”转换为“ In Progress ”(这种转换可以多次应用于同一个 id)。其他的过渡并不重要。下面是我想要的结果的一个例子,以及我到目前为止所做的尝试:
Diff =
var _ready = calculate(FIRSTNONBLANK(Query1[timestamp_utc],filter(query1,Query1[nextstatus] = "Ready")))
var _progress = calculate(FIRSTNONBLANK(Query1[timestamp_utc],filter(Query1,Query1[nextstatus]="In Progress")))
return
DATEDIFF(_ready,_progress,day)
指数 | ID | 时间戳 | 地位 | 天数差异 |
---|---|---|---|---|
1 | 25730 | 2020-06-24 07:22:31.297 | 进行中 | |
2 | 25730 | 2020-06-29 06:28:20.193 | 准备好 | |
3 | 25730 | 2020-06-30 07:21:05.147 | 进行中 | 1 |
4 | 25730 | 2020-06-30 09:40:27.670 | 准备好 | |
5 | 25730 | 2020-07-01 07:23:11.277 | 进行中 | 1 |
6 | 25730 | 2020-07-05 11:06:02.413 | 准备好 | |
110 | 25735 | 2020-06-30 09:36:04.050 | 准备好 | |
141 | 25738 | 2020-06-28 11:49:09.557 | 进行中 | |
142 | 25738 | 2020-06-28 11:51:44.503 | 准备好 | |
143 | 25738 | 2020-06-29 05:05:45.777 | 进行中 | 1 |
144 | 25738 | 2020-06-29 05:12:54.617 | 准备好 | |
145 | 25738 | 2020-07-13 12:17:46.873 | 准备好 | |
146 | 25738 | 2020-07-15 16:21:09.667 | 进行中 | 2 |
147 | 25738 | 2020-07-20 16:46:59.840 | 准备好 | |
148 | 25738 | 2020-07-24 16:49:57.003 | 进行中 | 4 |
解决方案
整个度量(如果索引是唯一的):
Measure 2 =
var __currentIndex = SELECTEDVALUE(Sheet1[Index])
var __currentID = SELECTEDVALUE(Sheet1[ID])
var __previousReady = CALCULATE( MAX(Sheet1[timestamp]), FILTER(ALL(Sheet1), Sheet1[ID] = __currentID && Sheet1[Index] < __currentIndex && Sheet1[Status] = "Ready"))
return
CALCULATE( DATEDIFF(__previousReady, SELECTEDVALUE(Sheet1[timestamp]) ,DAY), FILTER(ALL(Sheet1[Status]), Sheet1[Status] = "In Progress"))