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,就是合并后的完整时间段。
查询结果
执行后会得到符合需求的输出:
| DAYOFWEEK | MERGED_STARTTIME | MERGED_ENDTIME |
|---|---|---|
| 1 | 61200 | 65700 |
| 1 | 66000 | 67800 |
| 2 | 51000 | 52000 |
内容的提问来源于stack exchange,提问作者Russell Greenleaf
相关产品推荐
相关产品推荐

