sql >> Databasteknik >  >> RDS >> Sqlserver

SQL håller räkningen av händelser genom ett skjutfönster

Använd alternativet med CTE , KORSA ANSÖK operator och ROW_NUMBER rankningsfunktion

 ;WITH cte AS
 (
  SELECT [Date], Code
  FROM dbo.YourTable  
  GROUP BY [Date], Code
  )
  SELECT c.Date, c.Code, o.Occurrences
  FROM cte c 
    CROSS APPLY (
                 SELECT t2.[Date], t2.Code,
                        ROW_NUMBER() OVER(PARTITION BY c.[Date] ORDER BY t2.[Date]) AS Occurrences        
                 FROM dbo.YourTable t2
                 WHERE c.Code = t2.Code
                   AND DATEDIFF(day, t2.[Date], c.[Date]) BETWEEN 0 AND 1
                 ) o
  WHERE c.Code = o.Code AND c.[Date] = o.[Date] 
  ORDER BY c.[Date]

Demo på SQLFiddle

För att förbättra prestandan använd detta index

CREATE INDEX x ON dbo.YourTable([Date], Code)


  1. Upprätthållande av unik/primär nyckel - drop index

  2. hur man frågar Oracle-databas baserat på användarinmatning med asp.net c#

  3. Hur skickar man XML från C# till en lagrad procedur i SQL Server 2008?

  4. SQLite JSON_ARRAY()