Power Query员工任务排期重叠问题处理求助
问题解决:Power Query标记员工任务重叠状态
问题场景
现有员工任务排期表,员工工作时段为7:00-15:00,部分员工存在任务重叠情况(如员工123456的三个任务:7:00-11:00 Break、10:00-13:00 Job Order、12:00-15:00 Waiting,中间任务与前后任务均重叠)。需添加Flag列,标记任务为Overlap(重叠)或Not Overlap(非重叠),原代码执行时出现错误:
Expression.Error: We cannot convert the value null to type Logical. Details: Value= Type=[Type]
错误原因分析
原代码存在两个核心问题:
- 变量作用域冲突:
Table.SelectRows中使用[Index]<=[Index]-1时,内部的[Index]指向当前行的索引,导致筛选结果为空,List.Min/List.Max返回null,无法转换为逻辑值触发错误。 - 重叠判断逻辑不准确:原条件未能正确识别任务与前后任务的重叠关系,无法覆盖任务同时与前后任务重叠的场景。
正确解决方案
核心思路:按员工ID分组,在组内处理任务重叠判断(重叠仅发生在同一员工的任务之间),步骤如下:
- 按
Employee ID分组,保留组内所有任务数据 - 组内按
Task Start升序排序 - 添加自定义列,判断当前任务是否与上一个任务或下一个任务重叠
- 展开分组数据,得到最终结果
完整Power Query M代码
let Source = 你的数据源, // 替换为实际数据源 // 按员工ID分组,保留组内任务表 #"Grouped by Employee" = Table.Group(Source, {"Employee ID"}, {{"Tasks", each _, type table [Employee ID=text, Tasks=text, Task Start=datetime, Task End=datetime]}}), // 对每个员工的任务表进行处理:排序+标记重叠 #"Added Overlap Flag" = Table.AddColumn(#"Grouped by Employee", "Flagged Tasks", each let // 组内按任务开始时间升序排序 SortedTasks = Table.Sort([Tasks], {{"Task Start", Order.Ascending}}), // 获取任务数量 TaskCount = Table.RowCount(SortedTasks), // 添加索引列,方便定位前后任务 AddedIndex = Table.AddIndexColumn(SortedTasks, "RowIndex", 0, 1), // 添加Flag列 AddedFlag = Table.AddColumn(AddedIndex, "Flag", each let CurrentStart = [Task Start], CurrentEnd = [Task End], // 判断是否与上一个任务重叠 OverlapWithPrev = if [RowIndex] > 0 then CurrentStart < AddedIndex{[RowIndex]-1}[Task End] else false, // 判断是否与下一个任务重叠 OverlapWithNext = if [RowIndex] < TaskCount - 1 then CurrentEnd > AddedIndex{[RowIndex]+1}[Task Start] else false in // 只要与前或后任务重叠,标记为Overlap,否则为Not Overlap if OverlapWithPrev or OverlapWithNext then "Overlap" else "Not Overlap" ), // 移除临时索引列 RemovedIndex = Table.RemoveColumns(AddedFlag, {"RowIndex"}) in RemovedIndex ), // 展开标记后的任务表 #"Expanded Flagged Tasks" = Table.ExpandTableColumn(#"Added Overlap Flag", "Flagged Tasks", {"Tasks", "Task Start", "Task End", "Flag"}, {"Tasks", "Task Start", "Task End", "Flag"}), // 整理列顺序(可选,按需求调整) #"Reordered Columns" = Table.ReorderColumns(#"Expanded Flagged Tasks", {"Employee ID", "Tasks", "Task Start", "Task End", "Flag"}) in #"Reordered Columns"
结果验证
执行上述代码后,将得到符合需求的输出:
| Employee ID | Tasks | Task Start | Task End | Flag |
|---|---|---|---|---|
| 123456 | Break | 2/12/23 7:00 AM | 2/12/23 11:00 AM | Not Overlap |
| 123456 | Job Order | 2/12/23 10:00 AM | 2/12/23 1:00 PM | Overlap |
| 123456 | Waiting | 2/12/23 12:00 PM | 2/12/23 3:00 PM | Not Overlap |
| 123654 | Job Order | 2/12/23 7:00 AM | 2/12/23 3:00 PM | Not Overlap |
内容的提问来源于stack exchange,提问作者Ahmed_Abdelkader
相关产品推荐
相关产品推荐

