查找重叠的日期范围并添加相应的性能指标以衡量效率
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" )
+----------+------------------+-------+---------+-------------+------------+
| 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" )