SQL—可比较集合中的分区
在该表中@t: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
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。