如何从分组中选取任务量最少的员工(含并列场景处理)
任务分配:处理同组员工任务量并列的升序选取方案
针对业务需求——新任务分配给对应组内已分配任务量最少的员工,当组内多个员工任务量相同时通过升序排序选取,可通过以下SQL逻辑实现:
核心思路
- 统计每个组内各员工的已分配任务数量;
- 在组内对员工排序:优先按任务数升序(确保任务最少的排在最前),任务数相同时按指定字段(如员工姓名)升序,锁定唯一人选;
- 筛选每个组内排序后的首位员工,即为新任务的分配对象。
具体SQL实现
第一步:统计员工任务量
先计算每个组中每个员工的已分配任务数:
SELECT `Group`, Employee, COUNT(Task) AS TaskCount FROM task_table GROUP BY `Group`, Employee
第二步:排序并选取目标员工
借助窗口函数ROW_NUMBER()完成组内排序与筛选:
WITH EmployeeTaskCounts AS ( SELECT `Group`, Employee, COUNT(Task) AS TaskCount FROM task_table GROUP BY `Group`, Employee ) SELECT `Group`, Employee AS AssignedEmployee FROM ( SELECT `Group`, Employee, ROW_NUMBER() OVER ( PARTITION BY `Group` ORDER BY TaskCount ASC, Employee ASC ) AS rn FROM EmployeeTaskCounts ) ranked_employees WHERE rn = 1;
逻辑说明
- 针对C组的情况,James和Emma任务数均为2,
ORDER BY TaskCount ASC, Employee ASC会先按任务数排序,任务数相同时按员工姓名字典序升序排列,Emma的姓名字典序早于James,因此会被选为C组新任务的分配对象; - 若需调整并列时的排序依据(比如按员工ID升序),只需修改
ORDER BY中的第二个字段即可,例如改为ORDER BY TaskCount ASC, EmployeeID ASC。
内容的提问来源于stack exchange,提问作者JB999
相关产品推荐
相关产品推荐

