随时间计算一系列事件并提取持续时间的百分比
Computing a sequence of events over time and extract a percentage of duration
我有一个数据集,用于存储有关房间可用性状态的事件。
例如,如果有人在上午 8:30 进入房间,我会在我的 table 中得到以下行:
# room status date
--- ---- -------- -------------------
0 A1 OCCUPIED 2022-01-01 08:30:00
当此人离开房间时,会创建一个类似的事件。我的 table 看起来像这样:
# room status date
--- ---- --------- -------------------
0 A1 OCCUPIED 2022-01-01 08:30:00
1 A1 AVAILABLE 2022-01-01 09:15:00
实际上,table 有更多的条目,数据相互交织。
# room status date
--- ---- --------- -------------------
0 A1 OCCUPIED 2022-01-01 08:30:00 <--
1 B4 OCCUPIED 2022-01-01 08:32:00
2 C2 OCCUPIED 2022-01-01 08:41:00
3 A1 AVAILABLE 2022-01-01 09:15:00 <--
4 C2 AVAILABLE 2022-01-01 09:20:00
5 A1 OCCUPIED 2022-01-01 09:30:00 <--
6 B4 AVAILABLE 2022-01-01 10:00:00
7 A1 AVAILABLE 2022-01-01 12:00:00 <--
我目前正在寻找一种方法来从我的每个房间中提取 percentage/duration 可用性,但我不知道如何继续。
我创建了一些措施:
// A measure to count the total of status
Count status = COUNT(myTable[status])
// A calculated measure for available ones
Total available = CALCULATE([count status], myTable[status]=="AVAILABLE")
// A calculated measure for occupied ones
Total occupied = CALCULATE([count status], myTable[status]=="OCCUPIED")
我已经有了日期层次结构,这意味着我可以将粒度从年更改为月、工作日、一天中的小时。我还可以将过滤器应用于 select 一个小时范围,例如 8:00 到 18:00.
问题是,我创建的度量只是计算给定时间段内发生的变化次数(在下图中,时间),但它们并没有反映每个事件的实际持续时间,这意味着我的图表实际上是错误的。
如果以我的房间A1为例,在实际配置中,我的图表是这样的:
___ ___ ___ ___ ___ ___ ___ ___
| 0 | | | | | | | |
available | | 50| | |100| | | |
| |___| | | | | | |
|100| | | | | | | |
occupied | | 50| | | 0 | | | |
|___|___|___|___|___|___|___|___|
8 9 10 11 12 13 14 15
- 在第 8 列中,100% 已占用,因为此状态在数据集中有 1 个条目,而“可用”有 0 个条目。
- 在第 9 列中,50-50 因为每个状态 1 个条目(一个在 09:15,另一个在 09:30)
- ...
我要找的结果是这个:
___ ___ ___ ___ ___ ___ ___ ___
| | 25| 0 | 0 | | | | |
available | 50|___| | |100|100|100|100|
|___| | | | | | | |
| | 75|100|100| | | | |
occupied | 50| | | | 0 | 0 | 0 | 0 |
|___|___|___|___|___|___|___|___|
8 9 10 11 12 13 14 15
- 在第 8 列中,我会得到 50-50,因为房间在 08:00 和 08:30 之间可用,但后来被占用了
- 在第 9 列中,我会占用 75%,因为房间仅在 09:15 和 09:30
之间可用
- 在第 10 列中,我会得到 100% 占用
- ...
是否可以通过 DAX 度量获得它,或者我是否需要重组我的一些数据?
您的问题的解决方案是将计算列添加到您的源 table 中,其中包含同一房间中下一个事件的时间。 Room_No 这里是你的类别列。
首先,按类别(按房间)添加索引
Event_asc =
VAR Current_Category = Table[Category]
RETURN
RANKX (
FILTER (
Table,
Table[Category] = Current_Category
),
Table[DateTime], , ASC, Dense
)
然后添加此列:
Event_Next_Time =
VAR Current_Category = Table[Category]
VAR CurIndex = Table[Event_asc]
VAR Result =
CALCULATE(
MAX( Table[DateTime] ),
Table[Category] = Current_Category
&& Table[Event_asc] = CurIndex + 1,
REMOVEFILTERS()
)
RETURN
Result
一旦你有了它,只需添加第三列来计算两个日期时间(Event 和 NextEvent)之间的差异。
Lapse = DATEDIFF( Table[DateTime], Table[TimeOfNextEvent], SECOND )
剩下的对你来说应该很容易:-)
我有一个数据集,用于存储有关房间可用性状态的事件。
例如,如果有人在上午 8:30 进入房间,我会在我的 table 中得到以下行:
# room status date
--- ---- -------- -------------------
0 A1 OCCUPIED 2022-01-01 08:30:00
当此人离开房间时,会创建一个类似的事件。我的 table 看起来像这样:
# room status date
--- ---- --------- -------------------
0 A1 OCCUPIED 2022-01-01 08:30:00
1 A1 AVAILABLE 2022-01-01 09:15:00
实际上,table 有更多的条目,数据相互交织。
# room status date
--- ---- --------- -------------------
0 A1 OCCUPIED 2022-01-01 08:30:00 <--
1 B4 OCCUPIED 2022-01-01 08:32:00
2 C2 OCCUPIED 2022-01-01 08:41:00
3 A1 AVAILABLE 2022-01-01 09:15:00 <--
4 C2 AVAILABLE 2022-01-01 09:20:00
5 A1 OCCUPIED 2022-01-01 09:30:00 <--
6 B4 AVAILABLE 2022-01-01 10:00:00
7 A1 AVAILABLE 2022-01-01 12:00:00 <--
我目前正在寻找一种方法来从我的每个房间中提取 percentage/duration 可用性,但我不知道如何继续。
我创建了一些措施:
// A measure to count the total of status
Count status = COUNT(myTable[status])
// A calculated measure for available ones
Total available = CALCULATE([count status], myTable[status]=="AVAILABLE")
// A calculated measure for occupied ones
Total occupied = CALCULATE([count status], myTable[status]=="OCCUPIED")
我已经有了日期层次结构,这意味着我可以将粒度从年更改为月、工作日、一天中的小时。我还可以将过滤器应用于 select 一个小时范围,例如 8:00 到 18:00.
问题是,我创建的度量只是计算给定时间段内发生的变化次数(在下图中,时间),但它们并没有反映每个事件的实际持续时间,这意味着我的图表实际上是错误的。
如果以我的房间A1为例,在实际配置中,我的图表是这样的:
___ ___ ___ ___ ___ ___ ___ ___
| 0 | | | | | | | |
available | | 50| | |100| | | |
| |___| | | | | | |
|100| | | | | | | |
occupied | | 50| | | 0 | | | |
|___|___|___|___|___|___|___|___|
8 9 10 11 12 13 14 15
- 在第 8 列中,100% 已占用,因为此状态在数据集中有 1 个条目,而“可用”有 0 个条目。
- 在第 9 列中,50-50 因为每个状态 1 个条目(一个在 09:15,另一个在 09:30)
- ...
我要找的结果是这个:
___ ___ ___ ___ ___ ___ ___ ___
| | 25| 0 | 0 | | | | |
available | 50|___| | |100|100|100|100|
|___| | | | | | | |
| | 75|100|100| | | | |
occupied | 50| | | | 0 | 0 | 0 | 0 |
|___|___|___|___|___|___|___|___|
8 9 10 11 12 13 14 15
- 在第 8 列中,我会得到 50-50,因为房间在 08:00 和 08:30 之间可用,但后来被占用了
- 在第 9 列中,我会占用 75%,因为房间仅在 09:15 和 09:30 之间可用
- 在第 10 列中,我会得到 100% 占用
- ...
是否可以通过 DAX 度量获得它,或者我是否需要重组我的一些数据?
您的问题的解决方案是将计算列添加到您的源 table 中,其中包含同一房间中下一个事件的时间。 Room_No 这里是你的类别列。
首先,按类别(按房间)添加索引
Event_asc =
VAR Current_Category = Table[Category]
RETURN
RANKX (
FILTER (
Table,
Table[Category] = Current_Category
),
Table[DateTime], , ASC, Dense
)
然后添加此列:
Event_Next_Time =
VAR Current_Category = Table[Category]
VAR CurIndex = Table[Event_asc]
VAR Result =
CALCULATE(
MAX( Table[DateTime] ),
Table[Category] = Current_Category
&& Table[Event_asc] = CurIndex + 1,
REMOVEFILTERS()
)
RETURN
Result
一旦你有了它,只需添加第三列来计算两个日期时间(Event 和 NextEvent)之间的差异。
Lapse = DATEDIFF( Table[DateTime], Table[TimeOfNextEvent], SECOND )
剩下的对你来说应该很容易:-)