名称更改SQL查询 - 正面损耗

时间:2013-08-03 20:06:48

标签: sql sql-server casting where record

使用SQL Server Management Studio,我有一个Employee表,每当员工发生变化时,都有记录,无论是经理,薪酬等等。每当做出改变时,和EffectiveEndDateKey将被标记为最后一次完整字段是相关的,而下一条记录将在第二天标记为和EffectiveBeginDateKey。

我想要做的是提取员工在上个月更改职位之前的最后一条记录。目标是,如果员工在一个月内更改了职位,那将被视为"积极减员"我们正试图弄清楚在一个月内我们会得到多少积极的减员。 (它总是在前一个月,所以在where语句中我只拉动了前一个月的变化。)

看看下面: enter image description here

在这个例子中,7月4日,John Doe从担任Apple Store Clerk成为第二天担任经理,因此有一个职位变更。我想要的是将记录拉到红色框中(Jon的最后一天 - 七月 - 当她成为经理之前她是一名Apple Store职员)b / c告诉我一个EffectiveEndDateKey有一个变化导致职位变更。

所以where语句将有一个Cast来将EffectiveEndDateKey转换为日期,然后查看上个月的数据,只提取上个月(7月)有EffectiveEndDateKeys的记录,我需要帮助的是这些记录必须具有不同职位的部分。

如果有人在7月31日更改职称(因此他们的新职位/ EffectiveBeginDateKey是20130801),那仍然算作1个正面消耗,我们想要从7月31日起最后一个记录。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用自我加入来执行此操作:

select eprev.*
from Employee e
     Employee eprev
     on e.EmployeeId = eprev.EmployeeId and
        cast(cast(e.EffectiveBeginDateKey as varchar(255)) as datetime) =
            cast(cast(eprev.EffectiveEndDateKey as varchar(255)) as datetime) + 1
where cast(cast(e.EffectiveBeginDateKey as varchar(255)) as datetime) >= dateadd(mm, -1, getdate()) and
      eprev.JobTitle <> e.JobTitle;

此处的关键是将数字转换为datetime。 YYYYMMDD格式很容易转换,当它是一个字符串时。因此,首先转换字符串的数量,然后转换为日期时间。其余的只是联接的机制。

答案 1 :(得分:0)

由于你的字符串实际上只是ISO格式的日期(yyyymmdd),你甚至不需要将它转换为日期时间,你可以只获得前一行:

select E.EmployeeID, E.JobTitle, ENEXT.JobTitle as NextJobTitle
from Employee as E
    outer apply (
        select top 1 T.JobTitle
        from Employee as T
        where
            T.EmployeeID = E.EmployeeID and
            T.EffectiveEndDateKey > E.EffectiveEndDateKey
        order by T.EffectiveEndDateKey asc
    ) as ENEXT
where
    E.JobTitle <> ENEXT.JobTitle and
    E.EffectiveEndDateKey >= convert(nvarchar(8), dateadd(mm, datediff(mm, 0, getdate()) - 1, 0), 112)

请参阅SQL FIDDLE示例