Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008 R2 - Isole e lacune

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