0

使用 SQL Server Management Studio,我有一个 Employee 表,其中记录了员工每次发生变化时的记录,无论是经理、工资等级等等等。每当进行更改时,将标记 EffectiveEndDateKey最后一次完整的字段是相关的,下一条记录将具有第二天和 EffectiveBeginDateKey。

我要做的是提取员工在上个月更改职位之前的最后一条记录。目标是如果员工在给定月份内更改了他们的职位,这将被视为“积极减员”,我们试图弄清楚我们在给定月份获得了多少积极减员。(它总是针对上个月,所以在 where 语句中我只提取上个月的更改)。

看看下面: 在此处输入图像描述

在这个例子中,在 7 月 4 日,John Doe 从 Apple Store 店员变成了第二天的经理,因此职位名称发生了变化。我想要的是把记录拉到红框中(乔恩的最后一天 - 七月 - 在他成为经理之前,她是苹果商店的店员)b/c,告诉我 EffectiveEndDateKey 发生了变化,导致了一份工作标题改变。

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

如果说某人在 7 月 31 日更改了职位(因此他们的新职位/EffectiveBeginDateKey 是 20130801),那仍然算作 1 次积极的减员,我们希望从 7 月 31 日拉出最后的记录。

有什么想法吗?

4

2 回答 2

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示例

于 2013-08-04T06:06:37.447 回答
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 很容易转换,当它是一个字符串时。因此,首先将字符串的数字转换为日期时间。其余的只是连接的机制。

于 2013-08-03T20:15:54.717 回答