【问题标题】:SQL calculating seniority start dateSQL计算资历开始日期
【发布时间】:2018-12-09 13:01:41
【问题描述】:

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

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

业务逻辑如下: 如果员工在公司开始工作,在 6 个月内停止并重新开始工作,则他或她的资历从他或她在公司开始工作的第一个开始日期开始计算。 否则是新公司的开始日期。

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

参见以下示例:

【问题讨论】:

  • 数据只是测试数据:)
  • 这个问题是不是看不懂?
  • 令人困惑的是,预期结果只有一个 Employee,但有 2 个 SeniorityStart 日期。双重资历?
  • 是的,他有两个不同的资历开始日期。他的开始日期 (2019-05-01) 和最后结束日期 (2018-06-20) 之间的差异超过 6 个月,因此他的资历现在重新开始。
  • 我不会在 SQL 中这样做。这更容易在您的应用程序代码中实现和测试。

标签: sql-server date business-logic


【解决方案1】:

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

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

不是很漂亮,因为它使用了 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];

【讨论】:

  • 谢谢.. 这行得通。数据量低于 10.000 行,因此性能不是问题。
  • @uba2012 谢谢。我最初考虑为此使用递归 CTE,但这种类型的解决方案可能会更加伤害我的高尔夫编码本能。
猜你喜欢
  • 2020-07-20
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多