在没有Cursor的单个SQL表中合并数据

And*_*kes 18 sql t-sql aggregate cursor sql-server-2008

我有一个带有ID列的表和另一个带有数字的列.一个ID可以有多个数字.例如

ID | Number
 1 |  25
 1 |  26
 1 |  30
 1 |  24
 2 |  4
 2 |  8
 2 |  5
Run Code Online (Sandbox Code Playgroud)

现在基于这些数据,在一个新表中,我希望有这个

ID | Low | High 
1  |  24 |  26
1  |  30 |  30
2  |  4  |  5
2  |  8  |  8
Run Code Online (Sandbox Code Playgroud)

如你所见,我想合并任何数字连续的数据,如24,25,26.所以现在低点是24,高点是26,然后30仍然是一个单独的范围.我正在处理大量的数据,所以我宁愿不使用游标来提高性能(这是我以前做过的事情,而且减慢了很多事情)......实现这个目标的最佳方法是什么? ?我不是SQL专家,所以我不确定是否有可用的功能可以使这更容易,或者最快的方法是什么.

谢谢您的帮助.

Gor*_*off 36

关键的观察是一系列数字减去另一个序列是一个常数.我们可以使用生成另一个序列row_number.这标识了所有组:

select id, MIN(number) as low, MAX(number) as high
from (select t.*,
             (number - ROW_NUMBER() over (partition by id order by number) ) as groupnum
      from t
     ) t
group by id, groupnum
Run Code Online (Sandbox Code Playgroud)

其余的只是聚合.