Quelque chose comme ça devrait faire l'affaire SQL Fiddle
Il trouve des îlots de données séquentielles avec la même valeur pour SIGN
et leur attribue la même valeur de regroupement à l'aide de la technique de numérotation des lignes d'Itzik Ben Gan, puis les regroupe et les agrège. Les CROSS APPLY ... VALUES
dépivote le MIN
et 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