随时间计算一系列事件并提取持续时间的百分比

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
          

我要找的结果是这个:

            ___ ___ ___ ___ ___ ___ ___ ___
           |   | 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
          

是否可以通过 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 )

剩下的对你来说应该很容易:-)