Zoiets zou het werk moeten doen SQL Fiddle
Het vindt eilanden van opeenvolgende gegevens met dezelfde waarde voor SIGN
en wijst ze dezelfde groeperingswaarde toe met behulp van de rijnummertechniek van Itzik Ben Gan en groepeert ze en aggregeert ze. De CROSS APPLY ... VALUES
maakt de draaiing van de MIN
. ongedaan en 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