MSSQL的经典问题:现有范围(孤岛)

浏览: 1726

表结构如下:

create table dbo.T1
(
id int primary key
);

insert into dbo.T1
(
id
)
values (2),(3),(11),(12),(13),(27),(33),(34),(35),(42);

select *
from dbo.T1 with(nolock)
order by id;

Clipboard Image.png

观察数据可以发现,这批数据中存在几个连续:2-3,11-13,33-35,还有两个独立的数:27-27,42-42。有时候我们需要找出现有值的范围,又称孤岛,该怎么入手呢?方法很多,这里介绍一个高效的方法:

;with aaa as
(
select ROW_NUMBER() over(order by id) as rowindex,
id
from dbo.T1 with(nolock)
)
,bbb as
(
select *,
id-rowindex as diffindex
from aaa
)
select MIN(id) as StartId,
MAX(id) as EndId
from bbb
group by diffindex
order by diffindex;

Clipboard Image.png

怎么样,轻松吧,两个CTE搞定。这是最简单的应用,下次再介绍一个稍微复杂点的应用。

推荐 2
本文由 gogodiy 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册