使用TSQL排名函数为含生效日期的表生成最大最小变更日期
TSQL合并连续相同属性的人员变更记录
在MS SQL 2019环境中,存储人员变更信息的表存在以下场景:同一人员的相同属性组合(PersonID、FullName、Department、Room)被拆分为连续多行日期分段记录,且同一属性组合可能非连续出现。需要合并连续相同属性的行,获取该段的最小FromDate和最大ToDate,但直接使用GROUP BY会错误合并非连续的同属性组。
解决方案
通过两次使用ROW_NUMBER()窗口函数生成分组标识,将连续的同属性记录归为同一组后再聚合,具体实现如下:
WITH RankedRecords AS ( SELECT PersonID, FullName, Department, Room, FromDate, ToDate, -- 按人员属性分组后,按日期排序的组内行号 ROW_NUMBER() OVER (PARTITION BY PersonID, FullName, Department, Room ORDER BY FromDate) AS GroupRowNum, -- 全局按日期排序的行号 ROW_NUMBER() OVER (ORDER BY FromDate) AS GlobalRowNum FROM #Test ), GroupedRecords AS ( SELECT PersonID, FullName, Department, Room, FromDate, ToDate, -- 两个行号的差值作为连续同属性组的唯一标识 GlobalRowNum - GroupRowNum AS GroupID FROM RankedRecords ) SELECT PersonID, FullName, Department, Room, MIN(FromDate) AS FromDate, MAX(ToDate) AS ToDate FROM GroupedRecords GROUP BY PersonID, FullName, Department, Room, GroupID ORDER BY FromDate;
结果说明
执行上述代码后,会得到符合预期的合并结果:
- 2000-01-01 至 2000-07-01 的Sales/101组
- 2000-07-02 至 2000-09-05 的Sales/104组
- 2000-09-06 至 2001-04-02 的Sales/101组(非连续的同属性组未被错误合并)
- 2001-04-03 至 2002-01-02 的Marketing/101组
- 2002-01-03 至 2002-04-02 的Sales/104组
内容的提问来源于stack exchange,提问作者Sam Alex
相关产品推荐
相关产品推荐

