You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算员工服务年限:移除历史雇佣记录中的错误终止日期'1900-01-01'

解决方案

核心思路是:仅保留最新雇佣记录中标记为在职的'1900-01-01'终止日期,其余历史记录里的该错误值全部排除。可以通过窗口函数区分最新记录和历史记录,再结合条件过滤实现。

修改后的SQL代码

WITH ranked_employee_jobs AS (
    SELECT 
        PERSON_ID, 
        LAST_HIRE_DT, 
        TERMINATION_DT,
        -- 按雇佣日期倒序排序,最新记录排第1
        ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY LAST_HIRE_DT DESC) AS row_num
    FROM EMPLOYEE_JOB
    WHERE PERSON_ID = '10000669'
)
SELECT 
    PERSON_ID, 
    LAST_HIRE_DT, 
    TERMINATION_DT,
    CASE 
        WHEN Termination_dt = '1900-01-01' 
            THEN DATEDIFF(DAY, Last_Hire_dt, GETDATE()) / 365.25
        ELSE DATEDIFF(DAY, Last_Hire_dt, Termination_dt) / 365.25
    END AS total_years_of_service
FROM ranked_employee_jobs
-- 筛选条件:要么是最新记录(允许保留在职标记),要么终止日期不是错误值
WHERE (row_num = 1) OR (TERMINATION_DT != '1900-01-01')
ORDER BY LAST_HIRE_DT DESC;

代码说明

  • CTE部分:用ROW_NUMBER()给每个员工的记录按雇佣时间倒序编号,最新的记录编号为1。
  • 过滤条件:
    • row_num = 1:保留最新的雇佣记录,不管它的终止日期是不是'1900-01-01'(也就是保留在职状态的标记)。
    • TERMINATION_DT != '1900-01-01':历史记录里只保留有真实终止日期的条目,排除错误的'1900-01-01'。
  • 计算服务年限的逻辑和你原代码一致,仅调整了数据筛选范围。

如果需要批量处理所有员工,只需去掉WHERE PERSON_ID = '10000669'即可。

内容的提问来源于stack exchange,提问作者Jessie777

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:55:26