我的表格包含左右值的列。每行代表一个从左值开始到右值结束的节。
LeftValue RightValue
----------- -----------
1 2
3 4
8 9
10 11
12 13
14 15
16 18
20 25
26 27
我希望将其优化为最少数量的争议部分。对于以上数据,例外结果是
LeftValue RightValue
----------- -----------
1 4
8 18
20 27
某些部分已合并为一部分。例如1-2
和3-4
到1-4
。
在sql中有一些有效的方法吗?我用光标做了这个方法太慢了。
答案 0 :(得分:0)
如果您使用的是SQL Server 2012+,则可以使用超前/滞后:
;With cte as (
Select *, Bucket = Sum(Nextright) over(order by leftvalue) from (
Select *, Nextright = case when leftvalue - lag(rightvalue) over(order by leftvalue) <> 1 then 1 else 0 end
from #data
) a
) Select min(leftvalue) as leftvalue, Max(rightvalue) as rightvalue
from cte
group by bucket
输出如下:
+-----------+------------+
| leftvalue | rightvalue |
+-----------+------------+
| 1 | 4 |
| 8 | 18 |
| 20 | 27 |
+-----------+------------+