Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2008 R2 – Inseln und Lücken

So etwas sollte die Aufgabe SQL Fiddle erledigen

Es findet Inseln sequenzieller Daten mit demselben Wert für SIGN und ordnet ihnen den gleichen Gruppierungswert zu, indem er die Zeilennummerntechnik von Itzik Ben Gan verwendet, gruppiert sie und aggregiert sie. Die CROSS APPLY ... VALUES entpivotiert die MIN und 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