このようなものは、SQL Fiddle の仕事をするはずです。
SIGN
の値が同じシーケンシャル データの島を見つけます。 Itzik Ben Gan の行番号手法を使用して同じグループ化値を割り当ててから、それらをグループ化して集計します。 CROSS APPLY ... VALUES
MIN
のピボットを解除します と MAX
;WITH T1 AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY SIGN(PctGain) ORDER BY WSeqKey) - WSeqKey AS Grp FROM YourTable), T2 AS (SELECT MIN(WSeqKey) AS BeginSeq, MAX(WSeqKey) AS EndSeq, SIGN(PctGain) AS Sign FROM T1 GROUP BY Grp, SIGN(PctGain)) SELECT CASE Sign WHEN -1 THEN 'Negative' WHEN 0 THEN 'Equal' WHEN 1 THEN 'Positive' END AS [Sign], Descriptor, SeqKey FROM T2 CROSS APPLY (VALUES('Begin', BeginSeq), ('End', EndSeq)) V(Descriptor, SeqKey) ORDER BY SeqKey
プレ>