sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server 2008 R2:islas y lagunas

Algo como esto debería hacer el trabajo SQL Fiddle

Encuentra islas de datos secuenciales con el mismo valor para SIGN y les asigna el mismo valor de agrupación utilizando la técnica de números de fila de Itzik Ben Gan, luego los agrupa y los agrega. Los CROSS APPLY ... VALUES desvía el MIN y 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