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

SQL Server 2012中提取非连续分组的首尾月份值

解决SQL Server 2012中员工非连续职位分组的起始/结束月份问题

嘿,这个问题其实是SQL里很常见的连续区间分组场景,用SQL Server 2012支持的窗口函数就能完美解决。我给你拆解下思路,再直接上可运行的代码:

核心思路

要给每个员工的非连续职位月份分组,关键是先给连续的月份打上同一个"分组标识",然后基于这个标识计算每组的起始和结束月份:

  • 第一步:用ROW_NUMBER()窗口函数,按Employee和Position分区、Month排序,给每个行生成一个连续序号。然后用Month - 序号得到分组ID——连续的月份里,这个差值会保持不变,一旦月份断开,差值就会变化,刚好用来区分不同的非连续分组。
  • 第二步:用MIN(Month)和MAX(Month)窗口函数,按Employee、Position和分组ID分区,就能直接得到每个分组的起始和结束月份。

完整SQL代码

下面的代码用CTE模拟了你的原始数据,如果你有真实表,只需要把EmployeeData替换成你的表名即可:

WITH EmployeeData AS (
    -- 模拟你的原始数据,实际使用时替换为你的表
    SELECT 'John' AS Employee, 'A' AS Position, 1 AS Month UNION ALL
    SELECT 'John', 'A', 2 UNION ALL
    SELECT 'John', 'A', 3 UNION ALL
    SELECT 'John', 'A', 4 UNION ALL
    SELECT 'John', 'A', 5 UNION ALL
    SELECT 'John', 'A', 6 UNION ALL
    SELECT 'John', 'B', 7 UNION ALL
    SELECT 'John', 'B', 8 UNION ALL
    SELECT 'John', 'B', 9 UNION ALL
    SELECT 'John', 'B', 10 UNION ALL
    SELECT 'John', 'B', 11 UNION ALL
    SELECT 'John', 'B', 12 UNION ALL
    SELECT 'John', 'B', 13 UNION ALL
    SELECT 'John', 'C', 14 UNION ALL
    SELECT 'John', 'C', 15 UNION ALL
    SELECT 'John', 'C', 16 UNION ALL
    SELECT 'John', 'C', 17 UNION ALL
    SELECT 'John', 'C', 18 UNION ALL
    SELECT 'John', 'C', 19 UNION ALL
    SELECT 'John', 'C', 20 UNION ALL
    SELECT 'John', 'A', 21 UNION ALL
    SELECT 'John', 'A', 22 UNION ALL
    SELECT 'John', 'A', 23 UNION ALL
    SELECT 'John', 'A', 24 UNION ALL
    SELECT 'John', 'A', 25 UNION ALL
    SELECT 'John', 'A', 26
),
GroupedData AS (
    SELECT 
        Employee,
        Position,
        Month,
        -- 生成分组标识:连续月份的组会有相同的GroupID
        Month - ROW_NUMBER() OVER (PARTITION BY Employee, Position ORDER BY Month) AS GroupID
    FROM EmployeeData
)
SELECT 
    Employee,
    Position,
    Month,
    MIN(Month) OVER (PARTITION BY Employee, Position, GroupID) AS StartMonth,
    MAX(Month) OVER (PARTITION BY Employee, Position, GroupID) AS EndMonth
FROM GroupedData
ORDER BY Month;

运行结果示例

运行后你会得到如下结构的数据(截取关键部分):

EmployeePositionMonthStartMonthEndMonth
JohnA116
JohnA216
...............
JohnA616
JohnB7713
...............
JohnA212126
...............
JohnA262126

完全符合你需要的:每个非连续分组的所有行都会显示该组的起始和结束月份。

内容的提问来源于stack exchange,提问作者GSilva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:34:14