在人力资源管理和员工考勤分析中,计算最大连续工作时长是一个常见但具有挑战性的需求。这个指标不仅能帮助企业了解员工的工作模式,还能用于合规性检查、工作效率评估以及异常行为检测。本篇文章将介绍如何在PowerBI中实现这一指标的计算。
问题描述
某工厂在某一天记录了所有员工完成各项任务的用时,为评选优秀员工,现在需要统计每位员工的最大连续工作时长,即合并各任务的可合并工作时间后取最大的那一段时长。
其中,各项任务完成后,允许休息五分钟,并且休息时间算入工作时长。
例如:员工A处理第一个任务的用时为:[13:00, 14:00],处理第二个任务的用时为[14:03, 15:38],那么这两段时间可以合并成[13:00, 15:38],若处理第二个任务时的开始时间为14:05:01及之后,则不能进行合并。
具体问题如下图所示:
本案例的初始数据如下:
任务日志表:
uid | task id | start | end |
---|---|---|---|
A | 1 | 2025/1/1 13:00:00 | 2025/1/1 14:00:00 |
A | 2 | 2025/1/1 14:03:00 | 2025/1/1 15:38:00 |
A | 3 | 2025/1/1 16:00:00 | 2025/1/1 18:56:00 |
A | 4 | 2025/1/1 19:01:00 | 2025/1/1 19:30:00 |
B | 5 | 2025/1/1 8:10:11 | 2025/1/1 8:20:00 |
B | 6 | 2025/1/1 9:00:00 | 2025/1/1 10:00:00 |
B | 7 | 2025/1/1 10:04:00 | 2025/1/1 12:22:00 |
B | 8 | 2025/1/1 14:00:00 | 2025/1/1 15:23:00 |
B | 9 | 2025/1/1 15:27:00 | 2025/1/1 18:22:00 |
C | 10 | 2025/1/1 14:00:00 | 2025/1/1 15:22:30 |
D | 11 | 2025/1/1 8:00:00 | 2025/1/1 12:56:00 |
D | 12 | 2025/1/1 15:00:00 | 2025/1/1 22:58:00 |
D | 13 | 2025/1/1 23:02:13 | 2025/1/2 6:30:03 |
若需其它辅助表等,可自行创建并建模。
解题要点
首先,需要计算出员工所对应的所有连续工作时间段,然后取时间最长的即可。连续工作时间段的计算思路如下:
1、首先找出所有连续工作时间段的起始时间,只要某个任务的起始时间是连续工作时间段的起始时间,那么在它之前的任务的结束时间加上休息时间不会有大于等于它的。
2、然后找出所有连续工作时间段的结束时间,只要某个任务的结束时间是连续工作时间段的结束时间,那么在它之后的任务的开始时间减去休息时间不会有小于等于它的。
3、对于找出的每一个连续工作时间段的起始时间,再从所有结束时间中找到最接近它的那个结束时间,即可得到一段连续工作时间段的起始与结束时间。
解决方案
首先,数据模型如下图所示:
然后,创建如下度量值:
最大连续工作时长 =
IF(ISINSCOPE('任务日志表'[uid]),
VAR StartNode =
FILTER(
VALUES('任务日志表'[start]),
ISEMPTY(FILTER('任务日志表','任务日志表'[start]<EARLIER('任务日志表'[start]) && '任务日志表'[end]+TIME(0,5,0)>=EARLIER('任务日志表'[start])))
)
VAR EndNode =
FILTER(
VALUES('任务日志表'[end]),
ISEMPTY(FILTER('任务日志表','任务日志表'[end]>EARLIER('任务日志表'[end]) && '任务日志表'[start]-TIME(0,5,0)<=EARLIER('任务日志表'[end])))
)
RETURN
FORMAT(
MAXX(
GENERATE(StartNode,TOPN(1,FILTER(EndNode,'任务日志表'[end]>'任务日志表'[start]),'任务日志表'[end],ASC)),
'任务日志表'[end]-'任务日志表'[start]
),
"hh:nn:ss"
)
)
然后创建一个矩阵,并将用户ID字段作为行标签,再将上面的度量值放入矩阵的值字段即可,如下图所示:
总结
以上方法仅供参考,若有更优雅的解决方案,欢迎留言讨论,或者加入我们的技术交流群,一起享受这种思维碰撞的快乐吧!
PBI/DAX技术交流群(QQ):344353627