使用SQL Server Management Studio,我有一个Employee表,每当员工发生变化时,都有记录,无论是经理,薪酬等等。每当做出改变时,和EffectiveEndDateKey将被标记为最后一次完整字段是相关的,而下一条记录将在第二天标记为和EffectiveBeginDateKey。
我想要做的是提取员工在上个月更改职位之前的最后一条记录。目标是,如果员工在一个月内更改了职位,那将被视为"积极减员"我们正试图弄清楚在一个月内我们会得到多少积极的减员。 (它总是在前一个月,所以在where语句中我只拉动了前一个月的变化。)
看看下面:
在这个例子中,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日起最后一个记录。
有什么想法吗?
答案 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示例