使用间隔组合多行

时间:2017-08-23 08:47:07

标签: sql-server

我的表格包含左右值的列。每行代表一个从左值开始到右值结束的节。

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-23-41-4

在sql中有一些有效的方法吗?我用光标做了这个方法太慢了。

1 个答案:

答案 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 |
+-----------+------------+