Một cái gì đó như thế này sẽ thực hiện công việc SQL Fiddle
Nó tìm các đảo dữ liệu tuần tự có cùng giá trị cho SIGN
và phân bổ chúng cùng một giá trị nhóm bằng cách sử dụng kỹ thuật số hàng của Itzik Ben Gan, sau đó nhóm chúng lại và tổng hợp chúng. CROSS APPLY ... VALUES
bỏ chia nhỏ MIN
và 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