我正在使用sql Server 2008 R2.我有一个名为EmployeeHistory的表,其中包含以下结构和示例数据:
EmployeeID Date DepartmentID SupervisorID 10001 20130101 001 10009 10001 20130909 001 10019 10001 20131201 002 10018 10001 20140501 002 10017 10001 20141001 001 10015 10001 20141201 001 10014
请注意,随着时间的推移,Employee 10001已经更改了2个部门和多个主管.我想要做的是列出按日期字段排序的每个部门中该员工的工作的开始和结束日期.所以,输出看起来像这样:
EmployeeID DateStart DateEnd DepartmentID 10001 20130101 20131201 001 10001 20131201 20141001 002 10001 20141001 NULL 001
我打算使用以下查询对数据进行分区,但失败了.部门从001变为002然后又变回001.显然我不能通过DepartmentID进行分区……我确信我忽略了显而易见的事情.有帮助吗?先感谢您.
SELECT *,ROW_NUMBER() OVER (PARTITION BY EmployeeID,DepartmentID ORDER BY [Date]) RN FROM EmployeeHistory
解决方法
有点牵扯.最简单的是引用我为你创建的
this SQL Fiddle,它可以产生确切的结果.有一些方法可以提高性能或其他考虑因素,但这有望至少比某些替代方案更清晰.
要点是,首先获得数据的规范排名,然后使用它将数据分组,然后找到每个组的结束日期,然后消除任何中间行. ROW_NUMBER()和CROSS APPLY在可读性方面做了很多帮助.