2017-11-22 1 views

Antwort

0

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 
+0

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! –

Verwandte Themen