Qualcosa del genere dovrebbe fare il lavoro SQL Fiddle
Trova isole di dati sequenziali con lo stesso valore per SIGN
e alloca loro lo stesso valore di raggruppamento usando la tecnica del numero di riga di Itzik Ben Gan, quindi li raggruppa e li aggrega. Il CROSS APPLY ... VALUES
annulla il pivot MIN
e 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