T-SQL:根据范围将行转为列

T-SQL: transposing rows into columns based on a range

我有一个 table,成员,包含成员 ID 列表。

我需要一个将 return 两列的查询,显示列表中每个范围的开始和结束 ID。

请查看示例屏幕截图,它应该更清晰。

假设您为 Members table 中的每条记录分配一个行号,其中最低的成员 ID 是第 1 行,次低的是第 2 行,依此类推。像这样:

MemberID  RowNumber
123       1
124       2
125       3
211       4
212       5
214       6
320       7
321       8
322       9

两个连续行的 RowNumber 值之间的差异总是一个,而连续两个行的 MemberID 值之间的差异,假设原始 [=32= 中没有重复值],总是至少一个。因此,请考虑表达式 MemberID - RowNumber 在执行 table 时的行为:当且仅当它们的 MemberID 恰好相差一个时,两个连续行的表达式的值才相同;否则,第二行的值将大于第一行的值。调用此表达式 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