答案 0 :(得分:0)
假设您为Members
表中的每个记录分配一个行号,其中最低成员ID为第1行,下一个最低为第2行,等等。您将拥有以下内容:
MemberID RowNumber
123 1
124 2
125 3
211 4
212 5
214 6
320 7
321 8
322 9
两个连续行的RowNumber
值之间的差异始终为1,而两个连续行的MemberID
值之间的差异(假设原始表中没有重复值)始终为至少一个。因此,请考虑表达式MemberID - RowNumber
在表格中的行为方式:当且仅当MemberID
的差异恰好为1时,两个连续行的表达式的值才相同;否则,第二行的值将大于第一行的值。将此表达式称为GroupNumber
。
MemberID RowNumber GroupNumber
123 1 122
124 2 122
125 3 122
211 4 207
212 5 207
214 6 208
320 7 313
321 8 313
322 9 313
不同的GroupNumber
值准确地标识了您感兴趣的值的连续范围。所以您要做的就是编写一个简单的查询,生成GroupNumber
,如此处所述,然后将结果分组到该值以获得您想要的结果:
declare @Members table (MemberID bigint);
insert @Members values (123), (124), (125), (211), (212), (214), (320), (321), (322);
with GroupedMembers as
(
select
M.MemberID,
GroupNumber = M.MemberID - row_number() over (order by MemberID)
from
@Members M
)
select
FromID = min(G.MemberID),
ToID = max(G.MemberID)
from
GroupedMembers G
group by
G.GroupNumber
order by
G.GroupNumber;
结果:
FromID ToID
123 125
211 212
214 214
320 322