Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server 2008 R2 - Îles et lacunes

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