Angenommen, Sie jeden Datensatz in Ihrer Members
Tabelle eine Zeilennummer angeben, in dem die niedrigste Mitglied ID Zeile 1 ist, wird die nächste unterste Reihe 2, usw. Sie etwas davon haben würde:
MemberID RowNumber
123 1
124 2
125 3
211 4
212 5
214 6
320 7
321 8
322 9
der Unterschied zwischen RowNumber
Werten für zwei aufeinander folgende Reihen gibt immer ein, während der Unterschied zwischen MemberID
Werten für zwei aufeinanderfolgende Zeilen unter der Annahme, dass kein Wert in der ursprünglichen Tabelle wiederholt wird, immer mindestens Eins. Überlegen Sie sich also, wie sich der Ausdruck verhält, während Sie durch die Tabelle gehen: Der Wert dieses Ausdrucks für zwei aufeinanderfolgende Zeilen ist genau dann derselbe, wenn sich ihre MemberID
s genau um eins unterscheiden; Andernfalls ist der Wert für die zweite Zeile größer als für den ersten. Nennen Sie diesen Ausdruck 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
Die unterschiedlichen GroupNumber
Werte genau die angrenzenden Bereiche von Werten identifizieren, die Sie interessieren. Also alles, was Sie tun müssen, ist eine einfache Abfrage schreiben, die hier die GroupNumber
wie beschrieben erzeugt, und dann auf die Ergebnisse Gruppe dieser Wert zu bekommen, was Sie wollen:
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;
Ergebnisse:
FromID ToID
123 125
211 212
214 214
320 322
Excellent. Ich dachte an etwas in der Art von Reihen, aber ich kämpfte mit dem nächsten Teil. Das ist sehr nützlich, danke, Joe! –