确定整数范围并按起点和终点对它们进行分组

Dav*_*man 2 sql t-sql sql-server aggregate-functions

假设我有一个包含一列(IDNUMBER)的数据集,如下所示:

IDNUMBER
1
2
3
1001
1002
1003
1004
1005
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望将此列中存在的任何数据分成两列,表示连续值的范围.

START, END
1, 3
1001, 1005
Run Code Online (Sandbox Code Playgroud)

我可以用光标或循环来做到这一点,但是有基于集合的解决方案吗?

谢谢.

Joh*_*tti 5

这是一个经典的Gaps-and-Islands

Select [Start] = min(IDNUMBER)
      ,[End]   = max(IDNUMBER)
 From (    
        Select *
              ,Grp = IDNUMBER - Row_Number() over (Order by IDNUMBER)
         from YourTable
      ) A
 Group By Grp
Run Code Online (Sandbox Code Playgroud)

返回

Start   End
1       3
1001    1005
Run Code Online (Sandbox Code Playgroud)

为了帮助您可视化,子查询生成以下内容

在此输入图像描述