SQL 计算资历开始日期
SQL calculating seniority start date
我有一个 SQL 无法自己解决的问题。问题是我需要计算 table 名员工的资历开始日期。
table 比较简单,它有 4 列,第五列用于计算资历。
业务逻辑如下:
如果员工在公司开始工作,在 6 个月内停止并重新开始,那么他或她的资历从他或她在公司开始工作的第一个开始日期开始计算。
否则是新公司的开始日期。
我想我们需要比较员工开始日期和员工上次停止日期。
看下面的例子:
下面的解决方案使用 window 函数来获取第一个值。
基于累积总和的排名。
这是基于开始日期和上一个结束日期之间的月份差异。
不太漂亮,因为它使用 2 个子查询和 3 个 window 函数来处理看似简单的事情。
但它确实 return 那些预期的结果。
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];
我有一个 SQL 无法自己解决的问题。问题是我需要计算 table 名员工的资历开始日期。
table 比较简单,它有 4 列,第五列用于计算资历。
业务逻辑如下: 如果员工在公司开始工作,在 6 个月内停止并重新开始,那么他或她的资历从他或她在公司开始工作的第一个开始日期开始计算。 否则是新公司的开始日期。
我想我们需要比较员工开始日期和员工上次停止日期。
看下面的例子:
下面的解决方案使用 window 函数来获取第一个值。
基于累积总和的排名。
这是基于开始日期和上一个结束日期之间的月份差异。
不太漂亮,因为它使用 2 个子查询和 3 个 window 函数来处理看似简单的事情。
但它确实 return 那些预期的结果。
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];