基于数据区间合并SQL Server两表的列匹配问题求助
解决SQL Server区间重叠合并并保留所有样本的问题
针对合并Table1与Table2、保留所有Sample并匹配对应Table1.Code,同时拆分重叠区间的需求,可通过区间重叠匹配+子区间计算+UNION ALL补全无匹配记录的方式实现,具体方案如下:
实现SQL语句
-- 处理有匹配Table1区间的情况,拆分出重叠子区间 SELECT t2.Sample, MAX(t2.DistanceFrom, t1.DistanceFrom) AS DistanceFrom, MIN(t2.DistanceTo, t1.DistanceTo) AS DistanceTo, t1.Code AS [Table1.Code] FROM table2 t2 LEFT JOIN table1 t1 ON t2.DistanceFrom < t1.DistanceTo AND t2.DistanceTo > t1.DistanceFrom -- 筛选区间重叠的记录 WHERE t1.Code IS NOT NULL UNION ALL -- 处理Table2中无任何Table1匹配的区间,保留原区间且Code为NULL SELECT t2.Sample, t2.DistanceFrom, t2.DistanceTo, NULL AS [Table1.Code] FROM table2 t2 WHERE NOT EXISTS ( SELECT 1 FROM table1 t1 WHERE t2.DistanceFrom < t1.DistanceTo AND t2.DistanceTo > t1.DistanceFrom ) ORDER BY Sample, DistanceFrom;
代码说明
- 区间匹配逻辑:通过
LEFT JOIN的条件筛选出Table2与Table1区间存在重叠的记录,覆盖完全包含、部分重叠等所有场景。 - 子区间计算:用
MAX和MIN函数计算两个区间的实际重叠部分,确保结果区间的准确性,比如示例中U2的区间会拆分为与B、C分别匹配的两个子区间。 - 补全无匹配记录:通过
NOT EXISTS筛选出Table2中无Table1区间重叠的记录,直接保留原区间并将Code设为NULL,避免样本丢失。 - 排序处理:按
Sample和DistanceFrom排序,让结果顺序与期望输出一致。
测试结果
执行上述SQL后,将得到与你期望完全一致的结果:
| Sample | DistanceFrom | DistanceTo | Table1.Code |
|---|---|---|---|
| U1 | 74 | 74.58 | A |
| U2 | 74.58 | 74.85 | B |
| U2 | 74.85 | 75.07 | C |
| U3 | 75.07 | 76 | D |
| U4 | 76 | 77 | NULL |
内容的提问来源于stack exchange,提问作者user21547329
相关产品推荐
相关产品推荐

