如何在TSQL中合并无重叠的大整数区间?
TSQL合并重叠/相邻的整数区间
我有一张存储大整数区间的表,原始区间数据如下:
| start_point | end_point |
|---|---|
| 4999999995 | 4999999995 |
| 5000000000 | 5000000009 |
| 5000000000 | 5099999999 |
| 5000000010 | 5000000010 |
| 5000000011 | 5000000025 |
| 5000000026 | 5000000045 |
| 5090090903 | 5090090903 |
| 6000000000 | 6000000000 |
需要编写TSQL查询语句,将这些区间合并为无重叠的不相交区间,预期结果如下:
| start_point | end_point |
|---|---|
| 4999999995 | 4999999995 |
| 5000000000 | 5099999999 |
| 6000000000 | 6000000000 |
解决方案
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;
逻辑说明
- SortedIntervals:对所有区间按
start_point排序,同时计算到当前行为止的最大end_point,用来判断后续区间是否与前面的合并区间重叠/相邻。 - GroupedIntervals:用
LAG函数对比当前区间的起始点和上一个累计最大结束点,若当前起始点更大,则标记为新的不重叠区间。 - GroupIds:对新区间标记累加生成唯一组ID,确保同一合并区间的行共享同一个ID。
- 最后按组ID聚合,取每组最小的起始点和最大的累计结束点,得到最终的无重叠区间。
内容的提问来源于stack exchange,提问作者Tamás Kovács
相关产品推荐
相关产品推荐

