0

我正在使用 SQL Server 2008 R2。我有一个名为 Name 的表,其结构和示例数据如下:

ID         Date      Name         DOD
10001      200911    Kevin H      06/17/2000
10001      200912    Kevin        06/20/2000
10001      201001    Kevin        06/20/2000
10001      201012    K            06/20/2000
10001      201101    K            06/20/2000
10001      201406    Kevin        06/20/2000

请注意,员工 10001 随着时间的推移已经更改了 3 次名称和一次更改了 DOD。我要做的是按 ID、名称和 DOD 进行分组,以使数据在日期之间保持一致。我还需要获取这些组的最小和最大日期,并确保日期按顺序排列。如果名称或 DOD 发生变化,然后又变回原来的样子,则需要创建一个新组。

因此,输出将如下所示:

EmployeeID MinDate  MaxDate Name     DOD 
10001      200911   200911  Kevin H  06/17/2000
10001      200912   201001  Kevin    06/20/2000
10001      201012   201101  K        06/20/2000
10001      201406   201406  Kevin    06/20/2000 

Name 表非常大,因此会出现 Data 在 20 个月内保持一致,然后在 1 个月内保持一致,然后又在 20 个月内保持一致的情况。

提前感谢您,如果您需要更多信息,请告诉我。

4

1 回答 1

0

您可以使用行号的差异方法:

select employeeid, min(date) as mindate, max(date) as maxdate,
       name, dod
from (select t.*,
             row_number() over (partition by employeeid order by date) as seqnum_d,
             row_number() over (partition by employeeid, name, dod order by date) as seqnum_dnd
      from t
     ) t
group by employeeid, (seqnum_d - seqnum_dnd);

要查看它是如何工作的,请运行子查询。如果你盯着结果看了一会儿,你就会明白为什么在这种情况下行号的差异会起作用。

于 2017-08-10T19:33:16.700 回答