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

SQL Server 2014:合并连续时间区间的实现方法求助

合并SQL Server 2014中的连续时间段

针对你需要合并同星期内连续时间段的需求,这里提供一个基于CTE和窗口函数的可行方案,完全适配SQL Server 2014版本:

1. 示例数据准备

先模拟你提到的场景创建测试表和数据:

CREATE TABLE TimeIntervals (
    DAYOFWEEK INT,
    STARTTIME INT,
    ENDTIME INT
);

INSERT INTO TimeIntervals VALUES
(1, 61200, 62100),
(1, 62100, 63000),
(1, 63000, 65700),
(1, 66000, 67800), -- 与上一区间不连续,单独保留
(2, 51000, 52000);

2. 核心合并查询

通过CTE识别连续区间并分组,最终聚合得到合并后的结果:

WITH IntervalGroups AS (
    SELECT 
        DAYOFWEEK,
        STARTTIME,
        ENDTIME,
        -- 生成组ID:连续区间归为同一组,非连续则开启新组
        SUM(
            CASE 
                WHEN STARTTIME = LAG(ENDTIME) OVER (PARTITION BY DAYOFWEEK ORDER BY STARTTIME) 
                THEN 0 
                ELSE 1 
            END
        ) OVER (
            PARTITION BY DAYOFWEEK 
            ORDER BY STARTTIME 
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        ) AS GroupID
    FROM TimeIntervals
)
SELECT 
    DAYOFWEEK,
    MIN(STARTTIME) AS MERGED_STARTTIME,
    MAX(ENDTIME) AS MERGED_ENDTIME
FROM IntervalGroups
GROUP BY DAYOFWEEK, GroupID
ORDER BY DAYOFWEEK, MERGED_STARTTIME;

3. 逻辑解释

  • LAG()函数:按DAYOFWEEK分组、STARTTIME排序,获取当前行上一行的ENDTIME,用来判断是否连续。
  • 组ID生成:如果当前行的STARTTIME等于上一行的ENDTIME,标记为0(属于同一组);否则标记为1(新组开始)。通过累计求和这个标记,相同的GroupID代表同一连续区间。
  • 聚合结果:按DAYOFWEEK和GroupID分组,取每组的最小STARTTIME和最大ENDTIME,就是合并后的完整时间段。

查询结果

执行后会得到符合需求的输出:

DAYOFWEEKMERGED_STARTTIMEMERGED_ENDTIME
16120065700
16600067800
25100052000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:09:30