sql-server-2008 – 使用ROW_NUMBER()OVER(PARTITION BY …)时出现问题

前端之家收集整理的这篇文章主要介绍了sql-server-2008 – 使用ROW_NUMBER()OVER(PARTITION BY …)时出现问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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在可读性方面做了很多帮助.

原文链接:https://www.f2er.com/mssql/76550.html

猜你在找的MsSQL相关文章