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

时间:2017-11-22 17:57:36

标签: sql tsql pivot transpose

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

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

请参阅示例屏幕截图,该屏幕截图应提供更清晰的信息。

Example here

1 个答案:

答案 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