从SQL中的表中查找连续值

时间:2015-02-16 07:21:11

标签: sql sql-server gaps-and-islands

我想将一些sql表分配到范围

此表必须分开,

Id  num
0   1
0   2
2   2
2   5 

结果将是这样的,

id,minimum,maximum

id  min     max
0   1   2
2   2   2
2   5   5

1 个答案:

答案 0 :(得分:2)

您似乎正试图在num中找到不同id值的岛屿。这是一个相对常见的问题,因此您可以在SO中找到几个与岛屿相关的答案。

有多种方法可以实现这一目标,但最简单的方法之一是在#34;普通群岛" Solving Gaps and Islands中的部分:

WITH C AS
(
    SELECT id,num, num - DENSE_RANK() OVER(ORDER BY id,num) AS grp
    FROM islandtest
)
SELECT id,MIN(num) AS rangestart, MAX(num) AS rangeend
FROM C
GROUP BY grp,id;

在每个岛内,numDENSE_RANK对于每个后续行都会增加1,这意味着值num - DENSE_RANK保持不变,可以用作岛标识符。

在下一个岛屿上,DENSE_RANK仍然会增加1,但num会增加不同的数量,因此下一个岛屿会有不同的岛屿ID。

获得岛屿标识符后,您可以按其分组并检索num

的最小值,最大值

使用此脚本进行测试:

declare @islandtest table (Id int, num int);

insert into @islandtest values
(0,1),
(0,2),
(2,2),
(2,5);

WITH C AS
(
    SELECT id,num, num - DENSE_RANK() OVER(ORDER BY id,num) AS grp
    FROM @islandtest
)
SELECT id,MIN(num) AS rangestart, MAX(num) AS rangeend
FROM C
GROUP BY grp,id;

生成请求的输出:

id          rangestart  rangeend
----------- ----------- -----------
0           1           2
2           2           2
2           5           5