So etwas sollte die Aufgabe SQL Fiddle erledigen
Es findet Inseln sequenzieller Daten mit demselben Wert für SIGN
und ordnet ihnen den gleichen Gruppierungswert zu, indem er die Zeilennummerntechnik von Itzik Ben Gan verwendet, gruppiert sie und aggregiert sie. Die CROSS APPLY ... VALUES
entpivotiert die MIN
und 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