SQL:根据生效日期查找值

时间:2013-08-23 11:32:33

标签: sql sql-server

我们有一张员工表,另一张表显示了他们的角色历史。历史表具有从角色开始时起的生效日期。找到员工当前的角色是微不足道的,但我在某个时间点找到他们的角色时遇到了问题。

Example:

Table: Employee History

Columns: EmployeeID
         Effective Date
         Role

Sample Records: [ABC123, 1/4/2013, Developer]
                [ABC123, 6/9/2013, Designer]
                [DEF456. 8/5/2013, Manager]


Table: Event

Columns: EventID
         Date
         EmployeeID
         Event Type

Sample Records: [1, 6/6/2013, ABC123, BOOKED_HOURS]
                [2, 6/9/2013, ABC123, BOOKED_LEAVE]
                [3, 8/5/2013, DEF456, SICK_LEAVE]

然后,我有另一张表,显示了一系列随时间发生的事件,并希望了解事件发生时员工的角色。我希望能够使用纯SQL而不是函数来做到这一点。

我追求的结果集如下:

[6/6/2013, ABC123, Developer, BOOKED_HOURS]
[6/9/2013, ABC123, Designer, BOOKED_LEAVE]
[8/5/2013, DEF456, Manager, SICK_LEAVE]

可以安全地假设员工将始终拥有角色,即他们无法创建没有角色的事件。

我长期以来一直在抨击我的大脑,所以任何帮助都会受到高度赞赏。

1 个答案:

答案 0 :(得分:3)

您可以使用相关子查询执行此操作:

select e.*,
       (select top 1 eh.Role
        from EmployeeHistory eh
        where e.EmployeeId = eh.EmployeeId and
              e.date >= eh.EffectiveDate
        order by eh.EffectiveDate desc
       ) as Role
from Event e;