1

我有一个Employees 表和一个EmploymentHistory 表,它们记录了他们的就业状况的变化。我希望能够选择在给定日期(例如 2013 年 4 月 2 日,这只会产生下面的约翰史密斯)具有“雇用”状态的所有员工的列表。

Employees       
employeeId    lastName    firstName
1             Smith       John
2             Doe         Jane
3             Carson      Mike

EmployeeHistory         
employeeHistoryId   employeeId    employmentStatus    transactionDate
1                   1             Hired               3/1/2013
2                   2             Candidate           4/1/2013
3                   2             Not Hired           4/5/2013
4                   3             Candidate           1/1/2013
5                   3             Hired               1/3/2013
6                   3             Terminated          2/15/2013

谢谢!

4

1 回答 1

1

如果您的数据库支持row_number(),您可以使用它来查找每个员工在特定日期之前的最后一行。例如:

select  *
from    Employees e
join    (
        select  row_number() over (
                    partition by employeeId
                    order by transactionDate desc) as rn
        ,       employeeId
        ,       employmentStatus
        from    EmployeeHistory
        where   transactionDate < '2013-04-02'
        ) h
on      e.EmployeeId = h.EmployeeId
        and h.rn = 1 -- Only last row
where   h.employmentStatus = 'Hired'

SQL Fiddle 上的实时示例。

于 2013-05-27T16:23:32.597 回答