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

如何在TSQL中合并无重叠的大整数区间?

TSQL合并重叠/相邻的整数区间

我有一张存储大整数区间的表,原始区间数据如下:

start_pointend_point
49999999954999999995
50000000005000000009
50000000005099999999
50000000105000000010
50000000115000000025
50000000265000000045
50900909035090090903
60000000006000000000

需要编写TSQL查询语句,将这些区间合并为无重叠的不相交区间,预期结果如下:

start_pointend_point
49999999954999999995
50000000005099999999
60000000006000000000

解决方案

WITH SortedIntervals AS (
    -- 按起始点排序,计算到当前行的累计最大结束点
    SELECT 
        start_point,
        end_point,
        MAX(end_point) OVER (ORDER BY start_point ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_max_end
    FROM YourTableName -- 替换为实际表名
),
GroupedIntervals AS (
    -- 标记新的不重叠区间起点
    SELECT 
        start_point,
        end_point,
        running_max_end,
        CASE 
            WHEN start_point > LAG(running_max_end) OVER (ORDER BY start_point) THEN 1 
            ELSE 0 
        END AS is_new_group
    FROM SortedIntervals
),
GroupIds AS (
    -- 为每个合并区间分配唯一组ID
    SELECT 
        start_point,
        end_point,
        running_max_end,
        SUM(is_new_group) OVER (ORDER BY start_point ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS group_id
    FROM GroupedIntervals
)
-- 按组聚合得到合并后的区间
SELECT 
    MIN(start_point) AS start_point,
    MAX(running_max_end) AS end_point
FROM GroupIds
GROUP BY group_id
ORDER BY start_point;

逻辑说明

  1. SortedIntervals:对所有区间按start_point排序,同时计算到当前行为止的最大end_point,用来判断后续区间是否与前面的合并区间重叠/相邻。
  2. GroupedIntervals:用LAG函数对比当前区间的起始点和上一个累计最大结束点,若当前起始点更大,则标记为新的不重叠区间。
  3. GroupIds:对新区间标记累加生成唯一组ID,确保同一合并区间的行共享同一个ID。
  4. 最后按组ID聚合,取每组最小的起始点和最大的累计结束点,得到最终的无重叠区间。

内容的提问来源于stack exchange,提问作者Tamás Kovács

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:32:26