首页 > 解决方案 > SQL计算资历开始日期

问题描述

我有一个我自己无法解决的 SQL 问题。问题是我需要在员工表中计算资历开始日期。

该表相当简单,它有 4 列,第五列用于计算资历。

业务逻辑如下:如果员工在公司入职,6个月内停职再入职,则从入职日期开始计算其工龄。否则是新公司的开始日期。

我猜我们需要将员工的开始日期与员工的最后停止日期进行比较。

请参阅以下示例: 员工表

标签: sql-serverdatebusiness-logic

解决方案


下面的解决方案使用窗口函数来获取第一个值。

基于通过累积总和的排名。
这是基于开始日期和上一个结束日期之间的月差。

不完全漂亮,因为它使用 2 个子查询和 3 个窗口函数来完成看起来如此简单的事情。
但它确实返回了那些预期的结果。

select 
 EmployeeID, Departement, [Company Start Date], [Company End Date], 
 first_value([Company Start Date]) over (partition by EmployeeID, CummSumRank order by [Company Start Date]) as SeniorityStart
from 
(
    select *, sum(MonthDiffStartVersusPreviousEndToBig) over (partition by EmployeeID order by [Company Start Date]) as CummSumRank
    from 
    (
        select EmployeeID, Departement, [Company Start Date], [Company End Date],
        iif(datediff(month, lag([Company End Date]) over (partition by EmployeeID order by [Company Start Date]), [Company Start Date]) > 6, 1, 0) as MonthDiffStartVersusPreviousEndToBig
        from Employees
    ) as q1
) as q2
order by EmployeeID, [Company Start Date];

推荐阅读