查找重叠的日期范围并添加相应的性能指标以衡量效率

Find overlapped date ranges and add corresponding performance metrics to measure efficiency

+----------+------------------+-------+---------+-------------+------------+
|  Name    |  Booking Type    |  Job  | Loading | Start Date  |  End date  |
+----------+------------------+-------+---------+-------------+------------+
| John     | Chargeable       | job1  |      20 | 04/11/2019  | 31/01/2020 |
| John     | Chargeable       | job2  |     100 | 01/10/2019  | 31/12/2019 |
| John     | Chargeable       | job3  |     100 | 14/10/2019  | 01/11/2019 |
| John     | Chargeable       | job6  |      50 | 29/07/2019  | 30/09/2019 |
| John     | Chargeable       | job7  |      50 | 29/07/2019  | 30/09/2019 |
| John     | Vacation/Holiday | job8  |     100 | 10/01/2020  | 10/02/2020 |
| John     | Chargeable       | job9  |     100 | 23/03/2020  | 30/07/2020 |
| John     | Chargeable       | job10 |      50 | 20/01/2020  | 20/03/2020 |
| John     | Chargeable       | job11 |      20 | 03/02/2020  | 20/03/2020 |
| John     | Chargeable       | job12 |      30 | 22/01/2020  | 20/03/2020 |
| Kimberly | Chargeable       | job11 |      20 | 03/02/2020  | 20/03/2020 |
| Kimberly | Chargeable       | job13 |     100 | 22/01/2020  | 20/03/2020 |
| Kimberly | Chargeable       | job14 |     100 | 22/04/2020  | 20/04/2020 |
+----------+------------------+-------+---------+-------------+------------+

对于每一行,我试图找出工作日期范围是否与其他工作重叠。如果有重叠,我想将所有重叠作业的加载量相加。

这是我尝试过的,在 table:

中创建了一个新列
loading Status =
VAR staffname = 'Staff Booking'[Name ]
VAR jobstart = 'Staff Booking'[Start Date].[Date]
VAR jobend = 'Staff Booking'[End Date].[Date]
VAR bookingtype = 'Staff Booking'[Booking Type ]
RETURN
    IF (
        CALCULATE (
            SUM ( 'Staff Booking'[Loading] ),
            FILTER ( 'Staff Booking', 'Staff Booking'[Name ] = staffname ),
            FILTER ( 'Staff Booking', 'Staff Booking'[Booking Type ] == "Chargeable" ),
            FILTER (
                'Staff Booking',
                'Staff Booking'[Start Date].[Date] <= jobend
                    && jobstart <= 'Staff Booking'[End Date].[Date]
            )
        ) > 100
            && bookingtype = "Chargeable",
        "Overbooked",
        "Normal"
    )

但是,此代码遗漏了这种特殊情况:

根据上面的 DAX 公式,深蓝色表示作业超载(>100),浅蓝色表示作业正常(100)。

但是这里的深蓝色(第一和第二)是不正确的,因为它们在任何时间段都不会超过 100。它们被标记为过载的原因是 Dax 公式正在组合所有重叠的不同时间段的加载。

例如工作 12 = 工作 12 + 工作 10 + 工作 1 + 工作 20 = 120

这是错误的,因为作业 12 在任何时间段总是 100

例如工作 12 = 工作 12 + 工作 10 + 工作 1 = 100

作业 12 = 作业 12 + 作业 10 + 作业 20 = 100

1) 有没有办法调整 DAX 公式或任何其他方法以确保它纠正上述情况,以便在上述情况下不应将作业 12 视为超额预订

2) 作为纠正上述情况的副作用,出现了一种情况

if Job 20 加载设置为50,

然后作业 12 的加载总和将看到两个不同的阶段:

阶段 1) 作业 12 = 作业 12 + 作业 10 + 作业 1 = 100(正常)

阶段 2) 职位 12 = 职位 12 (30)+ 职位 10 (50) + 职位 20 (50) = 130(超额预订)

在这种情况下,DAX 公式应采用最高阶段并放入列 "Overbooked"

如果您使用日历 table,这会更容易。例如,您可以像这样计算选定 Name 的负载:

Load =
VAR ThisDate = SELECTEDVALUE ( Dates[Date] )
RETURN
    CALCULATE (
        SUM ( Booking[Loading] ),
        FILTER (
            Booking,
            Booking[Start Date] <= ThisDate &&
            Booking[End date] >= ThisDate &&
            Booking[Booking Type] = "Chargeable"
        )
    )

这是 x 轴 Dates[Date] 和值 Load 的可视化。

现在,由于这是针对每个 Dates[Date] 单独计算的,因此您的加载状态不应像以前那样重叠,并且度量可以像这样简单:

loading Status = IF ( [Load] > 100, "Overbooked", "Normal" )

编辑:

要将此作为计算列来执行,您需要查看作业期间的每一天,看看 [Load] 是否超过 100:

LoadingStatus =
VAR TempTable =
    ADDCOLUMNS (
        FILTER (
            Dates,
            Dates[Date] <= Booking[End date] &&
            Dates[Date] >= Booking[Start Date]
        ),
        "DayLoad", CALCULATE ( [Load], ALLEXCEPT ( Booking, Booking[Name] ) )
    )
RETURN
    IF ( MAXX ( TempTable, [DayLoad] ) > 100, "Overloaded", "Nomral" )