如何筛选员工最新任务:无进行中任务则取最晚结束日期
员工最新任务筛选方案
针对你的需求,只需调整ROW_NUMBER()的排序逻辑,就能优先选中进行中任务,无进行中任务时再选停止日期最晚的任务,具体SQL如下:
WITH ranked_tasks AS ( SELECT EMPLOYEE, START_DATE, STOP_DATE, ROW_NUMBER() OVER ( PARTITION BY EMPLOYEE ORDER BY -- 给进行中任务最高优先级,排在最前面 CASE WHEN STOP_DATE = '1753-01-01' THEN 0 ELSE 1 END ASC, -- 非进行中任务按停止日期倒序,取最晚的 STOP_DATE DESC ) AS rn FROM employee_tasks ) SELECT EMPLOYEE, START_DATE, STOP_DATE FROM ranked_tasks WHERE rn = 1;
逻辑说明
- 用CTE(公共表表达式)给每个员工的任务分组排名:
PARTITION BY EMPLOYEE确保仅在单个员工的任务范围内排序 - 排序规则分两步:
- 通过
CASE语句把进行中任务(STOP_DATE='1753-01-01')标记为0,其他任务标记为1,升序排序后0会排在最前面,保证有进行中任务时它是该员工的第1条记录 - 对于没有进行中任务的员工,直接按
STOP_DATE倒序排列,取最晚的那条任务
- 通过
- 最后筛选排名为1的记录,就是每个员工的最新任务
内容的提问来源于stack exchange,提问作者dhwu
相关产品推荐
相关产品推荐

