我正在使用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
名称表非常大,因此会有数据在20个月内保持一致,然后在1个月内不一致,然后在20个月内保持一致的情况。
提前感谢您,如果您需要更多信息,请与我们联系。
答案 0 :(得分: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);
要查看其工作原理,请运行子查询。如果你盯着结果一段时间,你会明白为什么在这种情况下行号的差异是有效的。