You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:05:18