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
我有一个 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