Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server 2008 R2 - острови и пропуски

Нещо подобно би трябвало да свърши работа SQL Fiddle

Той намира острови от последователни данни с една и съща стойност за SIGN и им разпределя една и съща стойност за групиране, като използва техниката за номера на редове на Ицик Бен Ган, след което ги групира и агрегира. CROSS APPLY ... VALUES отменя завъртането на MIN и 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 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Операцията не е валидна за състоянието на грешката на транзакцията и обхвата на транзакцията

  2. Свържете PHP към MSSQL чрез PDO ODBC

  3. Как мога да дебъгвам EXCEPTION_ACCESS_VIOLATION на SQL Server 2008

  4. Как да проверите настройката ANSI_NULLS на вашата сесия в SQL Server

  5. Преобразувайте „smalldatetime“ в „datetime2“ в SQL Server (примери за T-SQL)