名称更改SQL查询-正损耗

名称更改SQL查询-正损耗,sql,sql-server,casting,where,record,Sql,Sql Server,Casting,Where,Record,使用SQL Server Management Studio,我得到了一个Employee表,其中记录了员工每次发生变化时的情况,无论是it经理、薪级表等,只要发生变化,和EffectiveEndDateKey将被标记为最后一次与完整字段相关,并且下一条记录将第二天作为和EffectiveBeginDateKey 我想做的是提取一个员工在上个月更换职称之前的最后一份记录。我们的目标是,如果一名员工在一个月内改变了他们的职位,这将被视为积极的自然减员,我们试图计算出在一个月内我们会得到多少积极的自

使用SQL Server Management Studio,我得到了一个Employee表,其中记录了员工每次发生变化时的情况,无论是it经理、薪级表等,只要发生变化,和EffectiveEndDateKey将被标记为最后一次与完整字段相关,并且下一条记录将第二天作为和EffectiveBeginDateKey

我想做的是提取一个员工在上个月更换职称之前的最后一份记录。我们的目标是,如果一名员工在一个月内改变了他们的职位,这将被视为积极的自然减员,我们试图计算出在一个月内我们会得到多少积极的自然减员。它总是上个月的,所以在where语句中,我只提取上个月的更改

请看下面:

在这个例子中,在7月4日,John Doe从一名苹果商店的店员变成了第二天的经理,因此职位发生了变化。我想要的是在乔恩的最后一天——7月,当他成为经理之前,她是一名苹果商店的店员,b/c告诉我一个有效的日期键发生了变化,导致了职位的变化

所以where语句将有一个强制转换,将effectiveEndDate键转换为日期,然后查看上个月的数据,只提取上个月7月份具有effectiveEndDate键的记录,我需要帮助的是这些记录还必须具有不同的职务

如果说有人在7月31日更换了职位,那么他们的新职位/有效开始日期是20130801,那么这仍将被视为1个正损耗,我们希望从7月31日起刷新上一个记录


有什么想法吗?

您可以通过自连接来实现:

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;

这里的关键是将数字转换为日期时间。当格式为字符串时,YYYYMMDD很容易转换。因此,首先将字符串的数字转换为datetime。其余部分只是连接的机制。

由于字符串实际上只是ISO格式yyyymmdd中的日期,您甚至不必将其转换为datetime,您只需获得上一行:

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)

请参见示例

考虑到您只使用了一次dateadd,也许您应该使用它而不是+1,否则您应该解释各种sql或至少sql server中的日期在内部保存为十进制数,其中1.0=1day@xanatos . . . 我使用dateadd表示月份,因为月份有不同的天数。我用-1来减去一天,因为那比较短。谢谢戈登。我能够使用您的建议进行查询。