SQL—可比较集合中的分区

SQL—可比较集合中的分区,sql,sql-server,Sql,Sql Server,在该表中@t: s e Status 4 5 Available 6 7 Available 8 9 WL 10 11 Available 12 14 Available 我想返回如下数据集: s e Status 4 7 Available 8 9 WL 10 14 Available 基本上,将我的状态列分组为连续的集合,知道数据是按s排序的,s值将比前面的e值多一个 我想我需要使用如下查询对数据进行分区: select

在该表中@t:

s   e   Status
4   5   Available
6   7   Available
8   9   WL
10  11  Available
12  14  Available
我想返回如下数据集:

s   e   Status
4   7   Available
8   9   WL
10  14  Available
基本上,将我的状态列分组为连续的集合,知道数据是按
s
排序的,
s
值将比前面的
e
值多一个

我想我需要使用如下查询对数据进行分区:

select ROW_NUMBER() OVER (Partition by status, s order by s, e, status) As Row_number, *
from @t
order by s
但是结果并没有正确划分


正确的语法是什么?

这是一个空白和孤岛问题。如果时间段中没有间隔,则可以使用行号差:

select status, min(s) as s, max(e) as e
from (select t.*, 
             row_number() over (order by s) as seqnum,
             row_number() over (partition by status order by s) as seqnum_s
      from @t t
     ) t
group by status, (seqnum - seqnum_s)
order by min(s);

这是一个空白和孤岛问题。如果时间段中没有间隔,则可以使用行号差:

select status, min(s) as s, max(e) as e
from (select t.*, 
             row_number() over (order by s) as seqnum,
             row_number() over (partition by status order by s) as seqnum_s
      from @t t
     ) t
group by status, (seqnum - seqnum_s)
order by min(s);

是一个dbfiddle。

使用@t中的
表示SQL Server,因此我添加了标记。使用@t
中的
表示SQL Server,因此我添加了标记。您的评论的结果给了我不正确的结果。。可提供4 14 WL 8 9。。我想要4 7,8 9,1014@duckmike . . . 修复了错误并添加了一个dbfiddle。您的评论给我的结果不正确。。可提供4 14 WL 8 9。。我想要4 7,8 9,1014@duckmike . . . 修复了错误并添加了一个dbfiddle。