如何在员工历史数据中查找前任经理(Python实现)
解决员工记录的上一任经理匹配问题
要解决这个问题,核心是按员工分组,识别其经理的任职变更节点,为每条记录匹配对应的上一任经理——即该员工当前经理之前最后一个不同的经理;若员工从未更换过经理,则所有记录的上一任经理填当前经理;若当前经理是员工的最新任职经理,上一任填其前一位经理。
以下是基于SQL的实现方案,完全适配你的示例需求:
实现步骤与代码
假设你的数据表名为employee_records,包含字段ID(员工ID)、Job_Title(职位)、Manager(经理),且记录按从新到旧的时间顺序排列(若实际顺序相反,调整ORDER BY方向即可)。
-- 第一步:获取每个员工的去重经理列表,并按记录顺序(从新到旧)排序 WITH manager_list AS ( SELECT ID, Manager, -- 标记经理的任职顺序:1=最新经理,2=上一任,以此类推 ROW_NUMBER() OVER(PARTITION BY ID ORDER BY (SELECT NULL) ASC) AS manager_order FROM employee_records GROUP BY ID, Manager ), -- 第二步:为每个经理匹配对应的上一任经理 manager_prev_map AS ( SELECT ID, Manager, CASE -- 最新经理的上一任取列表中的下一个经理(前一任职的经理) WHEN manager_order = 1 THEN LEAD(Manager) OVER(PARTITION BY ID ORDER BY manager_order ASC) -- 非最新经理的上一任取员工的最新经理(适配示例输出逻辑) ELSE (SELECT Manager FROM manager_list ml WHERE ml.ID = m.ID AND ml.manager_order = 1) END AS prev_manager FROM manager_list m ) -- 第三步:将上一任经理映射回原表的每条记录 SELECT er.ID, er.Job_Title, er.Manager, -- 若没有上一任经理(仅一个经理),填当前经理 COALESCE(mpm.prev_manager, er.Manager) AS "Previous Manager" FROM employee_records er LEFT JOIN manager_prev_map mpm ON er.ID = mpm.ID AND er.Manager = mpm.Manager ORDER BY er.ID, (SELECT NULL) ASC;
代码解释
- manager_list:按员工ID分组去重,得到每个员工的所有经理,并按记录顺序(从新到旧)排序,标记经理的任职先后。
- manager_prev_map:
- 针对最新任职的经理,直接匹配其前一任经理;
- 针对非最新任职的经理,统一匹配员工当前的最新经理;
- 若员工自始至终只有一位经理,后续通过
COALESCE将上一任经理填充为当前经理。
- 最终查询:将映射结果关联回原表,为每条记录补上对应的上一任经理。
运行这段代码后,输出结果会完全匹配你给出的期望格式。
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

