我想将一些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
答案 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;
在每个岛内,num
和DENSE_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